2010-10-14 52 views

Trả lời

0

Tôi biết không có công cụ nào để phân tích các tệp kết xuất mySQL thô theo cách này.

Hoặc sao chép + dán (có khả năng rườm rà) hoặc nhập vào cơ sở dữ liệu tạm thời, thả mọi thứ khác và đưa bảng trở lại tệp.

+2

Sẽ không có lý do gì để xóa mọi thứ khác, bạn có thể mysqldump các bảng riêng lẻ – stew

+0

@stew điểm tốt. @OP đây là cách thực hiện: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html # option_mysqldump_tables –

0

Nếu bãi đã được thực hiện với cú pháp chèn mở rộng, sau đó dữ liệu bảng thực tế sẽ được thực hiện như một dòng duy nhất trong các tập tin dump:

INSERT INTO tablename (field, ...) VALUES (data, ...), (data, ...), (etc..) 

mà bạn chỉ có thể grep ra. Việc giải nén định nghĩa bảng thực tế sẽ khó hơn, mặc dù nó NÊN ngay lập tức trên dòng dữ liệu. Không có quyền truy cập vào một trình bao thích hợp tại thời điểm này, nhưng đi ra khỏi đỉnh đầu của tôi, một cái gì đó như thế này có thể làm các trick (trong mã giả):

# retrieve line # that data insertion for the wanted table occurs on 
DATALINE=`grep -l 'INSERT INTO tablename' dumpfile.sql` 

# limiting ourselves to the part of the file up to the data line, find the line number 
# of the last CREATE TABLE, which SHOULD be the one creating the table for the data 
CREATELINE=`head -$DATALINE|grep -l 'CREATE TABLE'|tail -1|awk '{"print $1"}'` 

Bạn có thể trích xuất DDL với đầu/đuôi đúng đắn và số dòng chúng tôi vừa truy xuất:

CREATE=`head -$CREATELINE dumpfile.sql|tail -$($CREATELINE - $DATALINE - 1)` 

hãy nhớ rằng tôi sẽ đảm bảo không hoạt động nhưng sẽ đủ để giúp bạn bắt đầu.

17

tôi thấy this nice solution, bạn phải tải về this script trên máy chủ của bạn và gõ

$> ./MyDumpSplitter.sh yourfile.sql your_table_name 

này sẽ trích xuất bảng của bạn thành your_table_name.sql


Optionnal

Bây giờ bạn có thể đổi tên nó bằng cách sử dụng loại lệnh này

$> sed -i 's/`your_table_name`/`your_table_name2`/g' your_table_name.sql 

Và tái tiêm nó với

mysql> source your_table_name.sql; 
+1

hãy cẩn thận: với việc trích xuất một bảng đơn từ một bãi chứa đầy đủ, 'các câu lệnh SET' ở đầu bãi chứa bị mất, ví dụ: SET NAMES utf8; - vì vậy bạn có thể nhập một bảng utf8 và nhận dữ liệu tranh giành bởi vì khách hàng sử dụng mã hóa sai! cùng một vấn đề với tất cả các giải pháp khác .... – michabbb

+0

Đúng vậy, cảm ơn bạn vì thông tin này –

2

Tôi chạy vào vấn đề mà một thời gian trước đây và đã viết một kịch bản Perl. Nó hoạt động tốt, nhưng nó là một phiên bản cũ của MySQL. Gọi nó thích:
extract.pl -table=TABLENAME mysqldumpfile.sql > recovered_table.sql

 
#!/usr/bin/perl -s -wnl 
#extract a single table from a mysql dump 
BEGIN { 
    $table or warn 
    "Usage: $0 -table=TABLE_TO_EXTRACT mysqldumpfile.sql" 
    and exit 1; 
} 

/^DROP TABLE IF EXISTS `$table`/ .. /^UNLOCK TABLES;$/ and print; 
2

chỉ đơn giản là bạn có thể chạy biên tập dòng cho lọc và chuyển lệnh văn bản như dưới đây:

 
$ sed -n -e '/CREATE TABLE.*products/,/CREATE TABLE/p' mysql.sql > products.sql 
0

Nếu bạn muốn trích xuất một cơ sở dữ liệu bạn có thể sử dụng:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' dumpfile > dbname.sql 2>error 

Ví dụ:

sed -n '/^-- Current Database: `blogs`/,/^-- Current Database: `/p' dump.sql > blogs.sql 2>error 
Các vấn đề liên quan