prosource

MySQL에서 Postgre로 전환SQL - 팁, 속임수, 잡동사니?

probook 2023. 10. 25. 23:22
반응형

MySQL에서 Postgre로 전환SQL - 팁, 속임수, 잡동사니?

MySQL에서 Postgre로의 전환을 고려하고 있습니다.SQL 입니다.

PostgreSQL과 함께 작업하기 위한 팁, 요령 및 gotchas는 무엇입니까?

MySQLer는 무엇을 주의해야 합니까?

참고 항목:Postgre는 얼마나 다른가요?SQL에서 MySQL로?
참고 항목:MySQL에서 Postgre로 마이그레이션SQL

참고 - 저는 이것이 중복이라고 생각하지 않습니다.특히 답변의 유형이 상당히 다르며, 여기서 답변하는 내용은 구현 세부 사항이 훨씬 많아 제가 찾고 있던 내용입니다.

그냥 내가 직접 겪은 일인데 아직도...

  • 대소문자 구분
  • 부족함INSERT IGNORE그리고.REPLACE
  • 거의 모든 곳에서 명시적인 캐스팅이 필요함
  • 뒷심 없음
  • LOAD DATA INFILE(COPY가깝지만 충분히 가깝지는 않습니다.)
  • 바꾸다autoincrement.SERIAL
  • 에서는만인 Postgres 에서는,INNER JOIN무탈하게ON절은 발생할 수 없습니다. 사용하십시오.CROSS JOIN기타 등등
  • COUNT(*)엄청나게 느릴 수 있습니다.
  • 데이터베이스는 테이블이 아닌 문자 집합으로 인코딩됩니다.
  • 여러 개의 스키마를 사용하여 여러 개의 데이터베이스를 가질 수 있음(MySQL에는 실제로 하나의 데이터베이스와 여러 개의 스키마만 있음)
  • 파티셔닝이 다릅니다.
  • MySQLinterval대 포스트그레스interval(시간 간격의 경우)
  • 암시적 열 이름 변경, Postgres 필요AS
  • Postgres에서 여러 테이블을 동시에 업데이트할 수 없음
  • 포스트그레스 기능은 강력합니다.그래서 없어요.CALL proc();; 다시 쓰다proc()기능적으로 그리고SELECT proc();.

이 작업은 방대한 작업이 될 것입니다. 코드 기반 전체를 테스트해야 하기 때문에 모든 쿼리를 어디서나 테스트해야 하기 때문입니다.

  • 구문
  • 올바른 동작(즉, 동일한 결과를 반환함)
  • 성과 - 예를 들어 성과의 후퇴/개선이 있으며, 이를 감당할 수 있습니까?
  • 오류 처리 - 오류 조건에서 동일하게 동작하지 않습니다. 코드가 특정 오류 코드에 의존하고 있었을 수 있습니다.

운영상 다음 사항을 살펴봐야 합니다.

  • 백업/복원
  • 디스크 공간 활용도
  • 메모리 활용도
  • 일회성 데이터 마이그레이션 - 시간이 많이 소요되는 큰 작업일 수 있음
  • 실패할 경우에 대한 롤백 계획
  • 모니터링 - MySQL을 어떻게 모니터링하고 있으며, 이러한 방법을 적용할 수 있습니까?
  • (관련된 경우) - 복제

이러한 조치를 고려하기 전에 반드시 많은 양의 성능 테스트를 수행해야 합니다.

이러한 비용으로 인해 대부분의 중요하지 않은 앱에서는 다른 데이터베이스로 이동하는 비용이 너무 많이 듭니다.위의 모든 작업을 수행하는 데 드는 방대한 비용에 대비하여 이점을 매우 신중하게 고려해 보십시오.

중요하지 않은 애플리케이션에서 3개월 미만이 소요되는 동안 정기적인 개발을 계속할 수 없다면 놀랄 것입니다.

Postgre를 시도해 볼 수 있습니다.가장 일반적인 문제를 포함하는 SQL Gotchas.일반적으로 포스트그레SQL 문서도 꽤 괜찮으니 베개 밑에 보관하세요.

또한 MySQL에서 Postgre로 변환pgsql 위키의 SQL.

MySQL 데이터베이스와 Postgre에 연결할 스크립트를 찾았습니다.SQL 데이터베이스와 내용만 전송하면 됩니다.그것은 저에게 매력적으로 작용했습니다.

https://github.com/philipsoutham/py-mysql2pgsql

설치자

$ pip install py-mysql2pgsql

달려.

$ py-mysql2pgsql

폴더에 저장하면 데이터베이스의 세부사항을 편집하고 입력할 수 있는 템플릿 설정 파일( mysql2pgsql.yml)이 작성됩니다.

작동하려면 argparse를 설치해야 했습니다.

$ pip install argparse

데이터베이스 세부 정보가 입력되면 다시 실행합니다.

$ py-mysql2pgsql

설정 파일과 동일한 폴더에 저장되어 있고, 헉, 당신은 끝입니다.화면에는 아무것도 출력되지 않았지만, 이후에 제 데이터베이스가 완전히 복사되었습니다.

변환하기 전에 서버를 다음과 같이 시작하여 MySQL을 ANSI-strictness로 설정합니다: --transaction-isolation=직렬화 가능 --sql-mode=ANSI

My Isam 테이블을 사용하지 않는지 확인합니다.

MySQL은 많은 변환을 허용합니다. pg는 캐스트가 필요합니다.

저장된 proc, 함수 및 트리거를 다시 작성해야 합니다.pg는 이러한 언어를 선택할 수 있지만 MySQL만큼 사용자 친화적이지 않은 언어를 설치해야 합니다.

pg는 Aggregate에 의해 그룹화되거나 Aggregate인 선택 목록 열에만 허용합니다. 이렇게 하면 MySQL은 그룹의 첫 번째 값을 선택하여 커닝합니다.

하지 않은 는 MySQL 합니다가 될 수. 동일하지 않은 연산자는 다음과 같을 수 있습니다.!=C와 같이 '&&'을 'and'의 동의어로, '|'를 'or' 등의 동의어로 허용합니다.특히 pg는 '||'를 문자열 카네이션(string catenation)이라는 뜻으로 사용합니다.

기본적으로 pg는 ANSI이고 MySQL은 그렇지 않습니다.pg로 변환하기 전에 MySQL이 ANSI를 최대한 엄격하게 준수하도록 하고, 응용 프로그램을 실행할 때 경고가 있는지 확인하는 것을 강력히 제안합니다.

수동 조정을 피할 수 없는 데이터베이스 구조 이동 외에...

가장 신뢰할 수 있는 데이터 전송 방법(구조가 동일한 경우 테이블별):

mysql --default-character-set=utf8 -e "SELECT * FROM mytable" > mytable.txt

psql
\copy mytable from '/path/to/mytable.txt' WITH NULL AS 'NULL';

최근에 다른 모든 접근 방식(수많은 옵션 + sed 등이 있는 mysqdump와 같은)을 시도했지만, 이처럼 좋은 방법은 없었습니다.

또한 이 방법을 사용하면 도중에 구조가 변경될 때 어느 정도 유연성을 얻을 수 있습니다. 적절한 SELECT를 작성하기만 하면 됩니다.

언급URL : https://stackoverflow.com/questions/772111/switching-from-mysql-to-postgresql-tips-tricks-and-gotchas

반응형