最近的开发过程中碰到了几个问题,都是知道不知道的类型,记录一下,避免下次再犯。

问题1 在程序中和MySQL做交互的时候,提示这个错误,

Column count doesn't match value count at row 1

从字面的意思,应该很直白了,一般出现在INSERT语句,指定的字段数据和数据库表的字段类型不同。

场景1  不指定具体插入的字段名称,但是实际在VALUES中的个数和表字段个数不同,

INSERT INTO table_name
VALUES (value1, value2, value3,...)

这就是为什么我们在规范中要求INSERT必须指定要插入的具体字段名称。

改为字段和VALUES字段一一对应,这个不香么?

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

场景2 INSERT语句指定了具体的字段名称,但是个数和VALUES不同,这就是考眼力了,

INSERT INTO table_name(col_name1, col_name2, col_name3) VALUES('value1','value2');

我的错误就是这场景,因为调整VALUES中某个值的时候多删了一个字段。

场景3 书写错误

其实和2很相近,例如多写了个","。

问题2 从MySQL集群环境用mysqldump导出导入数据的时候,提示这个错误,

@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty

他的意思是,当前GTID_EXECUTED参数已经有值,而从集群导出来的dump文件中包含了SET @@GLOBAL.GTID_PURGED的操作。

解决方案1 reset master

这个操作可以将当前库的GTID_EXECUTED值置空。

解决方案2 设置-set-gtid-purged=off

在dump导出时,添加--set-gtid-purged=off参数,避免将gtid信息导出,例如,

mysqldump -uroot -p --set-gtid-purged=off test > test.sql

问题3 MySQL导出的时候,一般用什么参数?

这个咨询了老杨,这是常用的参数,

mysqldump --single-transaction --master-data=2 --all-databases -E -R --triggers --set-gtid-purged=off

--single-transaction,为了不进行全局的锁表,但同时能保证数据一致性,加这个参数。

--master-data=2,master-data会将二进制日志的位置和文件名写入到输出中,2则会将change log行注释。

-E,指的是导出event,我理解就是Oracle中的job定时任务。

-R,导出存储过程和自定义函数。

--triggers,导出触发器,默认会导出,可使用--skip-triggers不导出。

如果是单机,一般用--single-transaction,可能就够了,如果是测试数据,或无业务请求,即使用lock-all-tables都可以。