Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mysqldump có xử lý dữ liệu nhị phân một cách đáng tin cậy không?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngày khác biệt trong MySQL để tính tuổi

  2. Làm thế nào để Kiểm tra xem Nút Radio được Kiểm tra hoặc Chọn trong jQuery?

  3. MySQL có thể được thay thế liền mạch bằng MariaDB hay có những thứ cần thay đổi trong trường hợp này?

  4. Cách chọn 6 tháng qua từ bảng tin tức bằng MySQL

  5. cấu trúc bảng mysql với nhiều biến