convert sqlite to mysql

니마, 처음에 데이터베이스를 잘 선택하지 않았는데 뒤에 고치는 것은 너무 엉망이야. 관건적인 운행 중의 데이터를 잃어버리면 안 돼. 멘붕이야.
1. schema 먼저
sqlite3 xxxx.db
>.output schema.sql
>.schema
mysql와 sqlite의 차이가 매우 큽니다.sed 스크립트를 써서 schema,sql를 변경합니다. 쓰면서 측정하고 복사할 수 없습니다.
#!/bin/sed -f 
#filename : schema.sed
#author: authur
#date : 2012-7-24

s/\(CREATE TABLE \)"\(\S*\)"/\1\2/
/\bid\b[^,]*PRIMARY KEY/s/PRIMARY KEY/AUTO_INCREMENT PRIMARY KEY/g
/[CREATE TABLE|integer|varchar]/s/"/`/g
/CREATE TABLE/s/\(text[^,]*\)DEFAULT[^,]*,/\1,/g
/CREATE TABLE.*workshop_blog/s/DEFAULT 'interview'//g
/CREATE TABLE.*workshop_topic/s/DEFAULT 'faq'//g
s/djangoratings_vote_content_type_id__object_id__cookie__user_id__key__ip_address/djratings_vote_ctype_id_object_id_cookie_user_id_key_ip_address/
s/djangoratings_vote_content_type_id__object_id__key__user_id__ip_address/djratings_vote_ctype_id_object_id_key_user_id_ip_address/

./schema.sed schema.sql > schema-mysql.sql
2. 데이터
데이터가 더 붕괴됩니다. mysql utf 문자 집합은 대소문자 민감성을 지원하지 않습니다. 데이터 형식도 지원하지 않습니다. 오류가 많습니다.
sqlite3 xxxx.db
>.output dump.sql
>.dump
먼저 schema를 수정합니다.sed는 다음과 같습니다.
#!/bin/sed -f 
#filename : schema.sed
#author: authur
#date : 2012-7-24


s/\(CREATE TABLE \)"\(\S*\)"/\1\2/
/\bid\b[^,]*PRIMARY KEY/s/PRIMARY KEY/AUTO_INCREMENT PRIMARY KEY/g
/[CREATE TABLE|integer|varchar]/s/"/`/g
/CREATE TABLE/s/\(text[^,]*\)DEFAULT[^,]*,/\1,/g
/CREATE TABLE.*workshop_blog/s/DEFAULT 'interview'//g
/CREATE TABLE.*workshop_topic/s/DEFAULT 'faq'//g
s/djangoratings_vote_content_type_id__object_id__cookie__user_id__key__ip_address/djratings_vote_ctype_id_object_id_cookie_user
_id_key_ip_address/
s/djangoratings_vote_content_type_id__object_id__key__user_id__ip_address/djratings_vote_ctype_id_object_id_key_user_id_ip_addr
ess/

s/PRAGMA foreign_keys=OFF;/SET foreign_key_checks = 0;/
s/BEGIN TRANSACTION;/START TRANSACTION;/
s/\(INSERT INTO \)"\(\S*\)"/\1\2/

그리고../schema.sed dump.sql > dump-mysql.sql
여기까지 만약 네가 큰 공이 이미 이루어졌다고 생각한다면 너는 틀렸다. 데이터가 유도될 수 있을지 없을지는 아직 확실하지 않다
우선 덤프-mysql을 시도해 보세요.sql에서 mysql를 가져옵니다. 대소문자가 민감하지 않아서 Duplicate 키나 다른 오류가 발생한 것을 발견하면 다음 방법을 시도해 보십시오.
mysql collation 설정cnf에 추가
[mysqld]
character-set-server=latin1 collation-server=latin1_general_cs #_cs는 마무리가 다 돼요. cs는 case sensitive, ci는 case insensitive, utf8은 없어요cs 마무리
mysql를 다시 시작해 보십시오.
만약 중국어로 unique 키를 만들면 가져오는 것도 기본적으로 문제가 있다. unique 키를 만들면 앞의 두 글자만 구별할 수 있을 것 같다. 니마.이걸 어떻게 해결할지, 업무를 봐야지. 내가 좀 거칠게 할게. 키 앞에 랜덤 문자를 붙여서 내가 알아서 할게.
update workshop_tag set name = substr(abs(random()), 1, 10) || name;

그리고 다시 덤프, schema로.sed 처리
이 두 문제를 처리했습니다. 저는 지금 데이터를 mysql로 가져올 수 있습니다. 중간에 숨겨진 문제가 있는지 없는지는 아무도 모르겠습니다. 우선 이렇게 사용하세요.
ps. 모든 것을 백업해서 돌릴 수도 돌아갈 수도 없으면 골치 아프게 하지 마라.

좋은 웹페이지 즐겨찾기