是否mysqldump的可靠地处理二进制数据?(Does mysqldump handle bina

2019-09-03 06:40发布

我在MySQL 5.6包含在某些领域的大型二进制数据的一些表。 我想知道如果我能相信通过创建转储mysqldump ,并确保这些二进制领域不会轻易传输转储文件槽系统,例如FTP,SCP和等时损坏。 另外,我要强迫这样的系统来处理转储文件为二进制传输,而不是ASCII码?

感谢您的任何意见!

Answer 1:

不,当你拥有的二进制块并不总是可靠的。 在这种情况下,你必须使用“--hex二进制大对象 ”标志,以得到正确的结果。

我在那里这些呼叫失败的情况下(导入不同的服务器上,但都运行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

它产生静静地失败导入文件。 加上“--skip-扩展插入”给我一个文件,该文件更易于调试,我觉得这条线产生,但无法读取(但报道没有错误或者出口或进口):

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

请注意,在二进制数据终端报价在原来的缺失。

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

列是二进制数据:

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`),
  ...

所以,不,你不仅可以不一定信任mysqldump的,你甚至不能依靠它,当一个发生时报告错误。


一个丑陋的解决办法我以前是mysqldump的加入选择这样转储排除两个受灾表:

--ignore-table=myalarm.panels 

那么这个bash脚本破解。 基本上运行SELECT产生其中NULL列的处理和二进制列被变成了UNHEX()调用像这样INSERT值:

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

如果你需要把它粘贴到你的选择发挥它的编辑。

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

这给了我一个名为“all.sql”的文件,需要在插入最后一个逗号变成了一个分号,那么就可以如上运行。 我需要的“进口大片缓冲区”的调整在互动mysql外壳和命令行来处理文件,因为它是两个大组。

mysql ... --max_allowed_packet=1GB

当我报我的错误,最终指向了“--hex二进制大对象”的标志,它不一样的我的解决方法,但在从我身边方式微不足道。 添加该选项,斑点被人抛弃的十六进制结束。



Answer 2:

从产生的转储mysqldump是可以信任的。

为了避免与编码,二进制传输等问题,使用--hex-blob选项,因此它在一个十六进制数转换的每个字节(例如,“ABC”变为0x616263)。 它将使转储更大,但是这将是有信息(因为它是纯文本,由于与上一个文本文件中的二进制数据生成的特殊符号,没有怪异的误解)最兼容的和安全的方式。

您可以确保信息的完整性(和加快转移)转储文件打包它放在一个RAR或ZIP文件。 这样,你可以很容易地检测到它并没有得到破坏与转移。

当您尝试将其加载到服务器上,请检查您已经在指定my.cnf服务器配置文件

[mysqld]
max_allowed_packet=600M

或更多,如果需要的。

顺便说一句,现在我只是做了迁移,并且倾倒大量的二进制数据的mysqldump它完美地工作。



Answer 3:

是的,你可以信任所产生的转储mysqldump

是的,你应该为了避免传输过程中的任何编码转换使用二进制传输。 MySQL的转储增加了控制命令转储,使服务器在一个特定的编码重新导入时解释文件。 你不想改变这种编码。



文章来源: Does mysqldump handle binary data reliably?