Xuất Cơ sở dữ liệu MySQL sang Cơ sở dữ liệu SQLite


Câu trả lời:


71

Có một tập lệnh shell Linux tuyệt vời trên Github giúp chuyển đổi Mysql thành tệp Sqlite3. Bạn cần cài đặt cả mysqldump và sqlite3 trên máy chủ của mình. Hoạt động tuyệt vời.


hoạt động tốt nhất cho đến nay! chỉ cần thiết để xóa một số câu lệnh "COLLATE xy" có mã hóa mà sqlite không hiểu. lưu ý rằng bạn sẽ không cần sqlite3 trên máy chủ của mình nếu bạn muốn sao chép cơ sở dữ liệu mysql của mình để phát triển cục bộ.
benzkji,

1
Thật không may đã không làm việc cho tôi. Ngoài các vấn đề với câu lệnh "PRIMARY KEY" được đề cập bên dưới, nhiều lỗi khác đã được báo cáo, liên quan đến câu lệnh "INSERT" và thiếu bảng ("đối tượng").
BartoszKP

2
Tác giả anandoned kịch bản, nhưng công việc vẫn tiếp tục trong này ngã ba: github.com/dumblob/mysql2sqlite
ilyaigpetrov

3
github.com/dumblob/mysql2sqlite hiện là phiên bản chính thức. 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
cảm ơn vì headsup ilyaigpetrov và @ Li-aungYip, tôi đã cập nhật liên kết
georgiecasey

7

Câu trả lời của @ user2111698 được chỉnh sửa bởi @quassy hoạt động như đã hứa. Vì tôi làm điều này thường xuyên nên tôi đã đưa các hướng dẫn của họ vào một tập lệnh 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

Có thể tìm thấy ý chính với các nhận xét chi tiết tại https://gist.github.com/grfiv/b79ace3656113bcfbd9b7c7da8e9ae8d


Nếu bạn định dạng mã của mình để loại bỏ thao tác cuộn, bạn sẽ giúp người khác đọc dễ dàng hơn.
zhon

Hạnh phúc đến; không nhanh chóng xem như thế nào
George Fisher

1
Nếu bạn xóa nhận xét, bạn đã hoàn tất việc cuộn dọc (thêm bất kỳ nhận xét nào bạn cho là quan trọng vào văn bản câu trả lời của bạn). Thao tác cuộn dọc có thể được xử lý bằng dấu gạch chéo ngược dòng mới.
zhon

nếu tệp sql của bạn lớn hơn 1GB, hãy chia nhỏ nó trước. nếu không thì tập lệnh perl cho lỗi vòng lặp thay thế.
nurp

3

mysql2sqlite.sh được đề cập trong bài đăng trên cùng không đối phó tốt với các dòng CHÍNH CHÍNH, nó không viết theo sau )để hoàn thành câu lệnh CREATE.

Đây là những gì tôi đã làm. Tôi đã chạy bãi chứa mysql như:

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

Sau đó, tôi đã sử dụng grep để xóa PRIMARY KEY và KEY:

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

Sau đó, tôi đã sử dụng một trình chỉnh sửa để sửa tệp. Khi các khóa được gỡ bỏ, bạn sẽ có câu lệnh CREATE trông giống như sau:

CREATE ...
  ...,
)

Dấu vết đó ,phải được loại bỏ. Trong vi, biểu thức này khớp với chúng,, $ \ n)

Sau đó, bạn cần thay đổi tất cả \'thành''

Sau đó, bạn có thể thực hiện nhập:

sqlite3 local.sqlite3 < localdb.txt.1

Và đó là nó. Tôi chưa tìm thấy một chương trình nào phù hợp với tôi. Tôi hi vọng điêu nay se giup được ai đo.


2

Tôi đã tạo cấu trúc bảng trong cơ sở dữ liệu sqlite bằng tay.

Hơn là tôi đã tải lên dữ liệu bằng lệnh teh sau:

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

Tôi đã phải sử dụng sed để sửa một mã hóa đỉnh khác nhau trong hai cơ sở dữ liệu


Cảm ơn vì điều này, nó rất hữu ích vì câu hỏi ban đầu không chỉ rõ liệu lược đồ tạo có cần được đưa vào hay không. Đơn giản hơn khi schema đã được thiết lập
kjones

0

Cá nhân tôi thích cách sử dụng mysqldump đơn giản, nhưng cần phải điều chỉnh một số (tùy thuộc vào nghệ thuật của bạn với Unix và những gì bạn muốn làm).

Ví dụ. chỉ cho một bảng (sản phẩm) với PK:

$ 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")
    );

Đối với những thứ phức tạp hơn, có lẽ tốt hơn nên viết một trình bao bọc, hoặc sau đó, sử dụng tập lệnh shell Linux awk tuyệt vời đã được đề cập trên Gist .


-1

Có một công cụ tuyệt vời, nhẹ được gọi là Trình duyệt cơ sở dữ liệu SQLite cho phép bạn tạo và chỉnh sửa cơ sở dữ liệu sqlite. Tôi đã sử dụng nó để tìm kiếm cơ sở dữ liệu cho các ứng dụng Android. Bạn có thể chạy các câu lệnh SQL dựa vào nó để tải dữ liệu lên, vì vậy nếu bạn xuất dữ liệu từ cơ sở dữ liệu mySQL, bạn có thể nhập dữ liệu đó bằng công cụ này. Đây là liên kết: http://sqlitebrowser.sourceforge.net/


2
Điều này giúp ích như thế nào với việc chuyển đổi MySQL?
CL.

2
Nó giúp bạn làm chính xác những gì bạn cần làm. Trên thực tế, tôi thực sự đang làm điều này ngay bây giờ Xuất MySQL của bạn bằng mysqldump hoặc phpMyAdmin và sau đó sử dụng công cụ trên để nhập nó vào cơ sở dữ liệu sqlite. Anh ấy yêu cầu "xuất cơ sở dữ liệu MySQL thành cơ sở dữ liệu SQLite" và công cụ trên sẽ là bước thứ hai để thực hiện chính xác những gì bạn cần. Bỏ phiếu giúp đỡ chính đáng là rất sai lầm. Tôi là người mới ở đây và câu trả lời của tôi không chỉ giải quyết câu hỏi mà còn là những gì tôi đang sử dụng ngay bây giờ trong tình huống thực tế. Đừng vội bỏ phiếu vô cớ và không khuyến khích mọi người tham gia.
Aaron Ratner

2
Bạn đã bỏ qua bước thứ hai thực tế (và quan trọng nhất), chuyển đổi tất cả các phần dành riêng cho MySQL của MySQL dump thành cú pháp tiêu chuẩn hoặc cụ thể cho SQLite.
CL.

4
Muộn, nhưng công cụ này không hoạt động cho vấn đề này. Nó không hỗ trợ cú pháp dành riêng cho MySQL (chỉ cú pháp SQLite). Bạn sẽ phải chỉnh sửa tệp kết xuất khá nhiều để nó được nhập thành công.
Sverri M. Olsen

5
@AaronRatner Không, giải pháp không hoạt động. Câu hỏi hỏi rõ ràng về việc chuyển đổi cơ sở dữ liệu MySQL và công cụ bạn khuyên dùng không xử lý cú pháp MySQL. Bạn không cần phải thực hiện điều này một cách cá nhân - từ những gì bạn đang nói, tôi đoán rằng bạn là người cần "thư giãn" :-) Nếu ai đó nói rằng giải pháp của bạn không hữu ích cho họ, họ chỉ đang nói thực tế đơn giản. Phản hồi của bạn rằng điều này là "đặc biệt khó khăn vì giải pháp là hữu ích" là vô lý. Tôi biết nó không hữu ích cho tôi, bởi vì nó không :-) Chúc mừng!
BartoszKP

-17

xuất dữ liệu với

  mysqldump database > database.sql

và nhập dữ liệu với

  sqlite3 database < database.sql

bạn có thể cần các tùy chọn -u (người dùng) và -p (mật khẩu)


9
Điều này có thực sự hoạt động với sự khác biệt và các tính năng có sẵn trong mysql và không có trong sqlite không?
rzetterberg

5
Điều này sẽ không hoạt động. Các chỉ số, mô tả bảng, trình tự thoát dữ liệu nhị phân, cơ chế khóa, có thể là những thứ khác, tất cả đều khác nhau giữa MySQL và SQLite.
CR.

Đây là một giải pháp tốt hơn nhiều: stackoverflow.com/questions/455606/…
Joseph

4
điều này sẽ không hoạt động. Hãy kiểm tra các giải pháp trước khi gửi bài bất cứ điều gì đầu tiên bạn nghĩ đến ...
Maciej Jankowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.