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 " --hex-blob "gắn cờ để nhận được kết quả chính xác.
Cảnh báo từ bình luận bên dưới:
Tôi gặp trường hợp các cuộc gọi này không thành công (nhập trên một máy chủ khác 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 không nhập được. Thêm "--skip-Extended-insert" mang lại cho tôi một tệp dễ gỡ lỗi 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 khi 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, bạn không chỉ có thể không nhất thiết phải tin tưởng mysqldump mà thậm chí bạn không thể dựa vào nó để báo cáo lỗi khi một lỗi xảy ra.
Một cách giải quyết tồi tệ mà tôi đã sử dụng là mysqldump loại trừ hai bảng bị ảnh hưởng bằng cách thêm các tùy chọn như thế này vào kết xuất:
--ignore-table=myalarm.panels
Sau đó, bản hack tập lệnh BASH này. Về cơ bản, hãy chạy một lệnh SELECT tạo ra các giá trị INSERT trong đó các cột NULL được xử lý và cột nhị phân được chuyển thành một lệnh gọi UNHEX () như sau:
(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),
Dán nó vào trình soạn thảo mà bạn chọn để chơi với nó nếu bạn cầ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 có tên "all.sql" cần dấu phẩy cuối cùng trong INSERT được chuyể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" trong cả trình bao mysql tương tác và dòng lệnh để xử lý tệp đó vì tệp lớn.
mysql ... --max_allowed_packet=1GB
Khi tôi báo cáo lỗi, cuối cùng tôi đã bị chỉ vào cờ "--hex-blob", cờ này thực hiện tương tự như cách giải quyết của tôi nhưng theo cách nhỏ của tôi. Thêm tùy chọn đó, các đốm màu được kết xuất dưới dạng hex, kết thúc.