MySQL에서 PostgreSQL로 수동 마이그레이션
MySQL 데이터베이스를 PostgreSQL로 수동으로 마이그레이션하는 절차는 다음과 같습니다: 협업 플레이북 및 Boards 마이그레이션에 대한 자세한 내용은 플러그인 마이그레이션 섹션을 참조하세요. 수동 업그레이드가 적합한 방법인지 확실하지 않으신가요?
MySQL 데이터베이스를 PostgreSQL로 수동으로 마이그레이션하는 절차는 다음과 같습니다:
협업 플레이북 및 Boards 마이그레이션에 대한 자세한 내용은 플러그인 마이그레이션 섹션을 참조하세요.
수동 업그레이드가 적합한 방법인지 확실하지 않으신가요? Mattermost 배포에 맞춤 지침이 필요한 Mattermost 고객은 Mattermost 전문가 에게 문의할 수 있습니다.
도구 권장 사항#
Postgres로 수동 마이그레이션을 선호하는 경우, 마이그레이션 프로세스에 다음 도구를 권장합니다:
이 페이지에는 각 도구의 설치 방법과 데이터베이스 마이그레이션 진행 방법이 포함되어 있습니다.필요한 도구를 설치한 후 시스템 요구 사항 및 구성 문서를 검토하고, 마이그레이션을 준비하기 위해 마이그레이션 전 무엇이 필요한지 파악하세요.
대상 데이터베이스 준비 부터 마이그레이션을 시작한 다음, 데이터 마이그레이션을 진행하고 모든 마이그레이션 후 단계를 완료하세요.
플레이북 및 Boards 마이그레이션에 대한 자세한 내용은 플러그인 마이그레이션 문서를 참조하세요.
pgloader#
pgloader 도구를 사용하여 MySQL에서 PostgreSQL로 데이터를 마이그레이션합니다.
pgloader 설치#
pgloader를 설치하려면 공식 설치 가이드를 참조하세요.
MySQL v8을 사용하는 경우: pgloader 컴파일 바이너리의 알려진 버그 로 인해 소스에서 pgloader를 컴파일해야 합니다. 이 단계 에 따라 소스에서 빌드하세요.
또는 pgloader를 설치하거나 빌드하지 않고 mattermost-pgloader Docker 이미지를 사용할 수도 있습니다. 자세한 내용은 아래 문서를 참조하세요.
pgloader 사용#
Docker 이미지 pull 및 pgloader 검증
수동 마이그레이션을 위해 다음 명령을 실행하여 mattermost-pgloader 이미지를 pull하고 pgloader가 올바르게 작동하는지 확인합니다:
docker run -it --rm -v $(pwd):/home/migration mattermost/mattermost-pgloader:latest pgloader --version
이 명령은 mattermost/mattermost-pgloader:latest 이미지를 pull하고 pgloader를 실행하여 버전을 확인하고 예상대로 작동하는지 확인합니다.
로컬 디렉터리 매핑
-v $(pwd):/home/migration 플래그를 사용하여 현재 작업 디렉터리를 Docker 컨테이너에 매핑합니다. 이를 통해 로그 및 기타 파일 저장에 로컬 디렉터리를 사용할 수 있습니다.
네트워크 구성 설정
네트워크 요구 사항에 따라 --network 플래그를 설정합니다. 예를 들어 localhost에 접근하려면 네트워크를 host로 설정해야 합니다.
morph#
morph 도구는 PostgreSQL 스키마를 생성합니다.
morph와 dbcmp 모두 Go 툴체인이 필요합니다. Go 컴파일러를 설치하려면 Go 문서를 따르세요.
morph 설치#
다음 명령을 실행하여 morph CLI를 설치할 수 있습니다:
go install github.com/mattermost/morph/cmd/morph@v1
dbcmp (선택)#
dbcmp 도구를 사용하면 마이그레이션 후 모든 테이블을 비교하고 두 스키마 간의 차이를 보고하여 데이터를 비교할 수 있습니다.
dbcmp 설치#
다음 명령을 실행하여 dbcmp를 설치할 수 있습니다:
go install github.com/mattermost/dbcmp/cmd/dbcmp@latest
수동 마이그레이션을 위한 시스템 요구 사항 및 구성#
수동 마이그레이션 프로세스를 시작하기 전에 시스템이 원활하고 효율적인 마이그레이션을 위한 필요 요구 사항을 충족하는지 확인해야 합니다. 다음 시스템 사양 및 조정을 강력히 권장합니다:
- 충분한 시스템 메모리 리소스를 확보하세요. 기본값으로 16GB RAM을 권장합니다. 시스템 메모리가 부족한 경우
number of workers,prefetch rows, 특히concurrency가1이상으로 설정된 경우rows per range와 같은 pgloader 설정을 세부 조정할 수 있습니다. 이러한 조정은 사용 가능한 시스템 리소스에 따라 리소스 활용을 최적화하는 데 도움이 됩니다. 자세한 내용은 pgloader 문서를 참조하세요. - 마이그레이션 프로세스, 특히 대규모 데이터셋을 처리할 때 충분한 처리 성능을 갖춘 멀티코어 프로세서를 권장합니다.
- MySQL 및 PostgreSQL 데이터베이스와 마이그레이션 프로세스 중 생성되는 임시 파일을 저장할 충분한 디스크 공간을 확보하세요. 필요한 디스크 공간은 마이그레이션되는 데이터베이스의 크기에 따라 다릅니다.
- 마이그레이션 시간을 더 줄이려면 마이그레이션 프로세스를 시작하기 전에 대상 PostgreSQL 데이터베이스의 인덱스를 수동으로 삭제할 수 있습니다. 이 방법은 데이터 삽입 중 인덱스 빌드 오버헤드를 줄여 마이그레이션을 잠재적으로 가속화할 수 있습니다.
수동 마이그레이션 전#
이 가이드는 v7.1 ESR 이상의 스키마가 필요합니다. 이전 버전이 있고 마이그레이션을 계획 중이라면 최소 v7.1로 Mattermost 서버를 업데이트하세요. 자세한 내용은 장기 지원 릴리즈 문서를 참조하세요.
- MySQL 데이터를 백업합니다.
- Mattermost 버전을 확인합니다. 자세한 내용은 정보 모달을 참조하세요.
- 마이그레이션 기간을 예약합니다. 이 프로세스는 마이그레이션 중 Mattermost 서버를 중지해야 합니다.
- 스키마 간 데이터 호환성을 위해 스키마 차이 섹션을 참조하세요.
- 데이터베이스와 사용자를 생성하여 PostgreSQL 환경을 준비합니다. 자세한 내용은 데이터베이스 문서를 참조하세요.
- PostgreSQL의 최신 버전에서 새로 생성된 사용자는
public스키마에 대한 접근 권한이 없습니다.GRANT ALL ON SCHEMA public to mmuser를 실행하여 명시적으로 접근 권한을 부여해야 합니다.
스키마 차이#
수동 마이그레이션 전에 두 스키마의 차이로 인해 오류 없는 마이그레이션을 위해 몇 가지 수동 단계가 필요할 수 있습니다.
텍스트에서 가변 문자로#
Mattermost MySQL 스키마가 다양한 테이블에서 PostgreSQL 스키마의 varchar 표현 대신 text 컬럼 유형을 사용하므로 PostgreSQL 스키마 제한 내에서 크기가 일관되는지 확인하는 것을 권장합니다.
필요한 삭제 또는 업데이트가 있는지 확인할 수 있습니다. 예를 들어 Audits 테이블/Action 컬럼에서 확인하려면 다음을 실행합니다:
SELECT FROM mattermost.Audits where LENGTH(Action) > 512;
다음 테이블은 추가적인 결과 없이 진행할 수 있는 삭제 또는 업데이트를 보여줍니다.
| 테이블 | 컬럼 | 데이터 유형 변환 | 삭제 시 결과 |
|---|---|---|---|
| Audits | Action | text -> varchar(512) | 애플리케이션 작동에 부작용 없음 (영향받는 행을 삭제해야 함). |
| Audits | ExtraInfo | text -> varchar(1024) | 애플리케이션 작동에 부작용 없음 (영향받는 행을 삭제해야 함). |
| ClusterDiscovery | HostName | text -> varchar(512) | 애플리케이션 작동에 부작용 없음 (영향받는 행을 삭제해야 함). |
| Commands | IconURL | text -> varchar(1024) | 필드를 삭제하거나 새 URL로 업데이트할 수 있음. |
| Commands | AutoCompleteDesc | text -> varchar(1024) | 필드를 삭제하거나 다시 작성할 수 있음. |
| Commands | AutoCompleteHint | text -> varchar(1024) | 필드를 삭제하거나 다시 작성할 수 있음. |
| RemoteClusters | Topics | text -> varchar(512) | 필드를 제거할 수 있음. |
| Systems | Value | text -> varchar(1024) | 극히 드문 경우, 이상적으로는 발생하지 않아야 함. |
다음 테이블은 스키마가 다를 수 있고 PostgreSQL 스키마 내의 데이터 크기 제약으로 인해 오류가 발생할 수 있는 여러 경우를 보여줍니다. 각 테이블/행에는 개별 검사가 필요하므로 삭제의 가능한 결과를 추가했습니다.
커뮤니티로부터 LinkMetadata 및 FileInfo 테이블에 일부 오버플로가 있었다는 보고가 다수 접수되었으므로 특히 이 테이블을 확인하는 것을 권장합니다. MySQL 스키마의 데이터가 이러한 제한을 초과하는지 확인하세요.
| 테이블 | 컬럼 | 데이터 유형 변환 | 삭제 시 결과 |
|---|---|---|---|
| Compliances | Keywords | text -> varchar(512) | 컴플라이언스 필터를 업데이트해야 함. |
| Compliances | Emails | text -> varchar(1024) | 컴플라이언스 필터를 업데이트해야 함. |
| FileInfo | Path | text -> varchar(512) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| FileInfo | ThumbnailPath | text -> varchar(512) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| FileInfo | PreviewPath | text -> varchar(512) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| FileInfo | Name | text -> varchar(256) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| FileInfo | MimeType | text -> varchar(256) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| LinkMetadata | URL | text -> varchar(2048) | 이 파일에 대한 이전 링크가 작동하지 않음 (영향받는 행을 삭제해야 함). |
| RemoteClusters | SiteURL | text -> varchar(512) | 이전 원격 클러스터가 제거됨 (영향받는 행을 삭제해야 함). |
| Sessions | DeviceId | text -> varchar(512) | 해당 기기의 사용자가 로그아웃됨 (영향받는 행을 삭제해야 함). |
| UploadSessions | FileName | text -> varchar(256) | 업로드 세션이 손실됨 (영향받는 행을 삭제해야 함). |
| UploadSessions | Path | text -> varchar(512) | 업로드 세션이 손실됨 (영향받는 행을 삭제해야 함). |
전체 텍스트 인덱스#
Posts 및 FileInfo 테이블의 일부 단어가 전체 텍스트 검색 인덱싱의 최대 토큰 길이 제한을 초과할 수 있습니다. 이 경우 PostgreSQL 스키마에서 idx_posts_message_txt 및 idx_fileinfo_content_txt 인덱스를 삭제하고, 마이그레이션 후 다음 쿼리를 실행하여 이 인덱스를 생성합니다:
마이그레이션 중 오류를 방지하기 위해 다음 쿼리가 포함되어 있습니다:
DROP INDEX IF EXISTS {{ .source_db }}.idx_posts_message_txt;
DROP INDEX IF EXISTS {{ .source_db }}.idx_fileinfo_content_txt;
지원되지 않는 유니코드 시퀀스#
PostgreSQL에서 허용되지 않는 특정 유니코드 시퀀스가 있는데, 바로
