2013-05-15 30 views
13

Tôi có một số bảng trong MySQL 5.6 có chứa dữ liệu nhị phân lớn trong một số trường. Tôi muốn biết nếu tôi có thể tin tưởng các bãi được tạo bởi mysqldump và chắc chắn rằng các trường nhị phân đó sẽ không bị hỏng một cách dễ dàng khi chuyển các tệp kết xuất máng như FTP, SCP và như vậy. Ngoài ra, tôi có nên ép buộc các hệ thống này xử lý các tệp kết xuất dưới dạng chuyển nhị phân thay vì ascii không?Liệu mysqldump có xử lý dữ liệu nhị phân một cách đáng tin cậy không?

Cảm ơn bạn trước vì đã nhận xét!

+2

http://forums.devshed.com/mysql-help-4/does-mysqldump-backs-up-blob-fields-of-tables-163361.html Tôi luôn sử dụng chế độ nhị phân ftp cho tất cả các tệp. Chưa bao giờ có bất kỳ tham nhũng nào. – user4035

+1

Bạn nên luôn kiểm tra việc nhập bằng cách nào đó. Lý tưởng nhất là bằng cách chạy tiện ích so sánh dữ liệu, nhưng điều đó thường liên quan đến việc sao chép phần lớn chuyển giao. Nhưng ngay cả các kho nén được phân biệt nhị phân ở cả hai đầu thông qua tổng kiểm tra cũng tốt hơn là đơn giản hy vọng mọi thứ đều ổn. –

Trả lời

-3

Có, bạn có thể tin tưởng các bãi được tạo bởi mysqldump.

Có, bạn nên sử dụng truyền nhị phân để tránh bất kỳ chuyển đổi mã hóa nào trong quá trình truyền. Kết xuất MySQL thêm các lệnh điều khiển vào kết xuất để máy chủ giải thích tệp trong một mã hóa cụ thể khi nhập lại. Bạn không muốn thay đổi mã hóa này.

+4

'mysqldump' không thêm lệnh điều khiển theo mặc định, cờ' --hex-blob' phải được chỉ định để đảm bảo không hiểu nhầm dữ liệu nhị phân bên trong tệp văn bản. –

+1

Xin lỗi, nhưng -1 từ tôi. Tôi cũng đã phải sử dụng cờ '--hex-blob' khi thực hiện một _dump/scp/restore_ giữa các hộp linux. –

19

Không, nó không phải lúc nào cũng đáng tin cậy khi bạn có các đốm màu nhị phân. Trong trường hợp đó, bạn PHẢI sử dụng cờ "--hex-blob" để nhận kết quả chính xác.

Tôi có một trường hợp các cuộc gọi thất bại (nhập khẩu trên một máy chủ khác nhau nhưng cả hai đều chạy Centos6/MariaDB 10):

mysqldump --single-transaction --routines --databases myalarm -uroot -p"PASSWORD" | gzip > /FILENAME.sql.gz 
gunzip < FILENAME.sql.gz | mysql -p"PASSWORD" -uroot --comments 

Nó tạo ra một tập tin mà âm thầm thất bại trong việc nhập khẩu. Việc thêm "--skip-extended-insert" cho tôi một tệp dễ debug hơn nhiều và tôi thấy rằng dòng này được tạo nhưng không thể đọc được (nhưng không có lỗi nào được báo cáo hoặc xuất hoặc nhập):

INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\\?ŖeV???,NULL); 

Lưu ý rằng báo giá kết thúc trên dữ liệu nhị phân bị thiếu trong bản gốc.

select hex(packet_key) from panels where id=1003; 
--> DE77CF5C075CE002C596176556AAF9ED 

Cột là dữ liệu nhị phân:

CREATE TABLE `panels` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `enabled` tinyint(1) NOT NULL DEFAULT '1', 
    `serial_number` int(10) unsigned NOT NULL, 
    `panel_types_id` int(11) NOT NULL, 
    `all_panels_id` int(11) NOT NULL, 
    `installers_id` int(11) DEFAULT NULL, 
    `users_id` int(11) DEFAULT NULL, 
    `packet_key` binary(16) NOT NULL, 
    `user_deleted` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    ... 

Vì vậy, không, không chỉ có thể giúp bạn không nhất thiết phải tin tưởng mysqldump, bạn có thể thậm chí không dựa vào nó để báo cáo một lỗi khi một xảy ra.


Một workaround xấu xí Tôi đã từng là mysqldump trừ hai bảng bị ảnh hưởng bằng cách thêm tùy chọn như thế này để các bãi chứa:

--ignore-table=myalarm.panels 

Sau đó này BASH kịch bản hack. Về cơ bản chạy một SELECT sản xuất giá trị INSERT nơi các cột NULL được xử lý và cột nhị phân được biến thành một UNHEX() gọi như vậy:

(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL), 

Dán nó vào trình soạn thảo của bạn lựa chọn để chơi với nó nếu bạn cần đến.

echo "SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;DELETE FROM panels;INSERT INTO panels VALUES " > all.sql 
mysql -uroot -p"PASSWORD" databasename -e "SELECT CONCAT('(',id,',', enabled,',', serial_number,',', panel_types_id,',', all_panels_id,',', IFNULL(CONVERT(installers_id,CHAR(20)),'NULL'),',', IFNULL(CONVERT(users_id,CHAR(20)),'NULL'), ',UNHEX(\"',HEX(packet_key),'\"),', IF(ISNULL(user_deleted),'NULL',CONCAT('\"', user_deleted,'\"')),'),') FROM panels" >> all.sql 
echo "SET UNIQUE_CHECKS=1;SET FOREIGN_KEY_CHECKS=1;" > all.sql 

Điều đó mang lại cho tôi một tệp gọi là "all.sql" cần dấu phẩy cuối cùng trong INSERT được biến thành dấu chấm phẩy, sau đó nó có thể chạy như trên. Tôi cần bộ chỉnh sửa "bộ đệm nhập lớn" được đặt trong cả vỏ mysql tương tác và dòng lệnh để xử lý tệp đó vì nó lớn.

mysql ... --max_allowed_packet=1GB 

Khi tôi báo cáo lỗi, tôi cuối cùng đã được trỏ vào cờ "--hex-blob", giống như cách giải quyết của tôi nhưng tầm thường từ phía bên của tôi.Thêm tùy chọn đó, các blob được bán phá giá dưới dạng hex, kết thúc.

+0

Tôi đã báo cáo lỗi này: http://bugs.mysql.com/bug.php?id=77879 –

+1

Lưu ý rằng lỗi đó vẫn bị gắn cờ "không thể lặp lại" hai năm sau bất chấp nỗ lực của tôi để mở lại và những người MySQL dường như không có xu hướng sửa chữa nó. –

4

Các bãi được tạo từ mysqldump có thể được tin cậy.

Để tránh các vấn đề với mã hóa, truyền nhị phân, v.v., sử dụng tùy chọn --hex-blob, do đó, dịch từng byte trong một số hex (ví dụ: 'abc' trở thành 0x616263). Nó sẽ làm cho bãi chứa lớn hơn, nhưng nó sẽ là cách tương thích và an toàn nhất để có thông tin (vì nó sẽ là văn bản thuần túy, không hiểu sai do các biểu tượng đặc biệt được tạo ra với dữ liệu nhị phân trên một tệp văn bản).

Bạn có thể đảm bảo tính toàn vẹn (và tăng tốc độ truyền tải) của tệp kết xuất đóng gói tệp trên tệp nén hoặc tệp zip. Bằng cách đó bạn có thể dễ dàng phát hiện ra rằng nó đã không bị hỏng với việc chuyển giao.

Khi bạn cố gắng để tải nó trên máy chủ của bạn, kiểm tra xem bạn đã gán trên my.cnf máy chủ tập tin cấu hình của bạn

[mysqld] 
max_allowed_packet=600M 

hoặc nhiều hơn nếu cần thiết.

BTW ngay bây giờ tôi vừa thực hiện di chuyển và đổ nhiều dữ liệu nhị phân với mysqldump và nó hoạt động hoàn hảo.

+2

Phản hồi của nhóm MySQL đối với lỗi trên là "sẽ không sửa, sử dụng giải pháp --hex-blob" để có vẻ như là giải pháp tốt nhất. –

Các vấn đề liên quan