MySQL 데이터베이스를 SQLite 데이터베이스로 내보내기


답변:


71

Github 에는 Mysql을 Sqlite3 파일로 변환 하는 환상적인 Linux 쉘 스크립트가 있습니다. 서버에 mysqldump와 sqlite3를 모두 설치해야합니다. 잘 작동합니다.


지금까지 가장 잘 작동합니다! sqlite가 이해하지 못하는 인코딩으로 일부 "COLLATE xy"문을 제거하는 데만 필요합니다. 로컬 개발을 위해 mysql 데이터베이스를 복제하려면 서버에 sqlite3가 필요하지 않습니다.
benzkji 2014 년

1
불행히도 나를 위해 작동하지 않았습니다. 아래에 언급 된 "PRIMARY KEY"문 문제 외에도 "INSERT"문 및 누락 된 테이블 ( "개체")과 관련된 다른 많은 오류가보고되었습니다.
BartoszKP 2015

2
저자는 스크립트를 anandoned하지만, 일이 포크에 계속 : github.com/dumblob/mysql2sqlite
ilyaigpetrov

3
github.com/dumblob/mysql2sqlite 가 이제 공식 버전입니다. 2016-05-11 17:32 GMT+2 @esperlu declared MIT as a fitting license (also retrospectively) and the original gist as deprecated.
Li-aung Yip

1
리튬 aungYip headsup의 ilyaigpetrov 및 @ 덕분에, 내가 링크를 업데이 트했습니다
georgiecasey

7

@quassy가 편집 한 @ user2111698의 답변은 약속대로 작동합니다. 이 작업을 자주 수행하기 때문에 bash 스크립트에 지침을 넣습니다.

#!/bin/bash

mysql_host=localhost
mysql_user=george
mysql_dbname=database
sqlite3_dbname=database.sqlite3

# dump the mysql database to a txt file
mysqldump \
  --skip-create-options \
  --compatible=ansi \
  --skip-extended-insert \
  --compact \
  --single-transaction \
  -h$mysql_host \
  -u$mysql_user \
  -p $mysql_dbname \
  > /tmp/localdb.txt

# remove lines mentioning "PRIMARY KEY" or "KEY"
cat /tmp/localdb.txt \
  | grep -v "PRIMARY KEY" \
  | grep -v KEY \
  > /tmp/localdb.txt.1

# mysqldump leaves trailing commas before closing parentheses  
perl -0pe 's/,\n\)/\)/g' /tmp/localdb.txt.1 > /tmp/localdb.txt.2

# change all \' to ''
sed -e 's/\\'\''/'\'''\''/g' /tmp/localdb.txt.2 > /tmp/localdb.txt.3

if [ -e $sqlite3_dbname ]; then
    mv $sqlite3_dbname $sqlite3_dbname.bak
fi
sqlite3 $sqlite3_dbname < /tmp/localdb.txt.3

자세한 설명이있는 요지는 https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d 에서 찾을 수 있습니다.


스크롤을 없애기 위해 코드의 형식을 지정하면 다른 사람이 더 쉽게 읽을 수 있습니다.
zhon

행복하다; 빨리 볼 수 없습니다 방법
조지 피셔

1
주석을 제거하면 세로 스크롤이 완료됩니다 (중요하다고 생각하는 주석을 답변 텍스트에 추가). 수직 스크롤링은 백 슬래시 줄 바꿈으로 처리 할 수 ​​있습니다.
zhon 2016 년

SQL 파일이 1GB보다 크면 먼저 분할하십시오. 그렇지 않으면 펄 스크립트가 대체 루프 오류를 제공합니다.
nurp

3

상단 게시물에서 언급 한 mysql2sqlite.sh는 PRIMARY KEY 행에 잘 대처하지 못하며 )CREATE 문을 완료하기 위해 후행 을 작성하지 않습니다 .

이것이 내가 한 일입니다. mysql 덤프를 다음과 같이 실행했습니다.

mysqldump --skip-create-options --compatible=ansi --skip-extended-insert --compact --single-transaction -h<host> -u<user> -p<passwd> <database name> > localdb.txt

그런 다음 grep을 사용하여 PRIMARY KEY 및 KEY를 제거했습니다.

cat localdb.txt | grep -v "PRIMARY KEY' | grep -v KEY > localdb.txt.1

그런 다음 편집기를 사용하여 파일을 수정했습니다. 키가 제거되면 다음과 같은 CREATE 문이 생성됩니다.

CREATE ...
  ...,
)

그 후행 ,을 제거해야합니다. vi에서이 표현식은, $ \ n)과 일치합니다.

그런 다음 모두 \'''

그런 다음 가져 오기를 수행 할 수 있습니다.

sqlite3 local.sqlite3 < localdb.txt.1

그리고 그게 다야. 저에게 효과가있는 단일 프로그램을 찾지 못했습니다. 누군가에게 도움이되기를 바랍니다.


2

sqlite 데이터베이스에서 테이블 구조를 수동으로 만들었습니다.

다음 명령으로 데이터를 업로드했습니다.

mysqldump -u root {database} {table} --no-create-info --skip-extended-insert  --complete-insert --skip-add-locks  --compatible=ansi | sed "s/\\\'/''/g" |sqlite3 flora.db

두 데이터베이스에서 다른 apex 인코딩을 수정 하기 위해 sed 를 사용해야 했습니다.


덕분에 원래 질문에는 스키마 생성이 포함되어야하는지 여부가 지정되지 않았기 때문에 도움이되었습니다. 간단한 스키마가 이미되었습니다 설치는
kjones

0

개인적으로 나는 mysqldump의 간단한 사용법을 좋아하지만 약간의 조정이 필요합니다 (유닉스를 사용하는 기술과 수행하려는 작업에 따라 다름).

전의. PK가있는 하나의 테이블 (prods)에 대해 :

$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
$ mysqldump mysql prods -u ME -pPASS  --compatible ansi --compact |grep -v "^\/\*" |sqlite3 testme2.db
    Error: near line 1: table "prods" already exists
    Error: near line 7: UNIQUE constraint failed: prods.id, prods.ts
$ sqlite3 testme2.db '.schema'
    CREATE TABLE "prods" (
      "id" varchar(30) NOT NULL DEFAULT '',
      "ts" int(11) NOT NULL DEFAULT '0',
      "val" double DEFAULT NULL,
      PRIMARY KEY ("id","ts")
    );

더 복잡한 일을 위해서는 래퍼를 작성하는 것이 더 좋을 것입니다. 또는 Gist 에서 이미 언급 한 환상적인 awk Linux 쉘 스크립트를 사용하십시오 .


-1

SQLite 데이터베이스 브라우저라는 환상적이고 가벼운 도구가있어서 sqlite 데이터베이스를 만들고 편집 할 수 있습니다. Android 앱용 데이터베이스를 만드는 데 사용했습니다. SQL 문을 실행하여 데이터를로드 할 수 있으므로 mySQL 데이터베이스에서 데이터를 내보내는 경우이 도구를 사용하여 가져올 수 있습니다. 다음은 링크입니다. http://sqlitebrowser.sourceforge.net/


2
이것이 MySQL 변환에 어떻게 도움이됩니까?
CL.

2
필요한 작업을 정확히 수행하는 데 도움이됩니다. 사실 저는 지금이 일을 말 그대로하고 있습니다. mysqldump 또는 phpMyAdmin을 사용하여 MySQL을 내 보낸 다음 위의 도구를 사용하여 sqlite 데이터베이스로 가져옵니다. 그는 "MySQL 데이터베이스를 SQLite 데이터베이스로 내보내기"를 요청했으며 위의 도구는 필요한 작업을 정확히 수행하는 두 번째 단계가 될 것입니다. 정당한 도움을 거절하는 것은 너무 잘못되었습니다. 나는 여기에 새로 왔으며 내 대답은 질문에 답했을뿐만 아니라 실제 상황에서 지금 사용하고있는 것입니다. 이유없이 너무 빨리 반대표를 던지지 말고 사람들이 참여하지 못하도록하십시오.
Aaron Ratner

2
실제 두 번째 (그리고 가장 중요한) 단계를 생략하고 MySQL 덤프의 모든 MySQL 관련 부분을 SQLite 관련 또는 표준 구문으로 변환했습니다.
CL.

4
늦었지만이 도구는이 문제에 대해 작동하지 않습니다. MySQL 특정 구문을 지원하지 않습니다 (SQLite 구문 만 해당). 성공적으로 가져 오려면 덤프 파일을 상당히 많이 편집해야합니다.
Sverri M. Olsen 2014

5
@AaronRatner 아니요, 솔루션이 작동하지 않습니다. 이 질문은 MySQL 데이터베이스 변환에 대해 명시 적으로 묻고 권장하는 도구는 MySQL 구문을 처리하지 않습니다. 당신은 이것을 개인적으로 받아 들일 필요가 없습니다 – 당신이 말하는 것에서 나는 당신이 "휴식"을 필요로하는 사람이라고 생각합니다. :-) 누군가 당신의 해결책이 그들에게 도움이되지 않는다고 말하면 그들은 단지 간단한 사실. 이것이 "솔루션이 도움이되기 때문에 매우 어렵다"는 귀하의 대답은 어리 석습니다. 나는 그것이 나에게 도움이되지 않는다는 것을 압니다. 왜냐하면 그것이 아니기 때문입니다. :-) 건배!
BartoszKP 2015

-17

데이터 내보내기

  mysqldump database > database.sql

데이터를 가져옵니다.

  sqlite3 database < database.sql

-u (사용자) 및 -p (암호) 옵션이 필요할 수 있습니다.


9
이것이 실제로 sqlite가 아닌 mysql에서 사용 가능한 차이점 및 기능과 함께 작동합니까?
rzetterberg

5
작동하지 않습니다. 인덱스, 테이블 설명, 이진 데이터 이스케이프 시퀀스, 잠금 메커니즘, 아마도 다른 것들은 MySQL과 SQLite에서 모두 다릅니다.
CR.

이것은 훨씬 더 나은 솔루션입니다 : stackoverflow.com/questions/455606/...
조셉

4
이것은 작동하지 않습니다. 첫번째 ... 당신의 마음에 오는 어떤 게시하기 전에 솔루션 테스트하십시오
마체이 잔 코브 스키
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.