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.
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
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. –