首页

mysql sorce导入数据提示ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL'用mysqldump导入提示ERROR 2006 (HY000) at line 896: MySQL server has gone away

背景介绍: 阿里的mysql服务确实很贵,而且任务编排服务下架开始推收费服务来替代,于是决定自建mysql。 由于服务器是ubuntu24直接安装原来的mysql5.7.4有兼容问题,mysql8又不兼容之前的服务部分sql语句,最终选择docker安装mysql5.7。 数据迁移与导入: mysqldump数据导出的时候发现部分日志表异常庞大,于是用了--ignore="数据库.忽略的表",大致语句 <code> mysqldump -h远程地址 -u数据库账户名 -p数据库密码 --ignore-table=database_name.table_name database_name > backup.sql </code> -要限定where条件则加上了 --where="datetime>yyyy-mm-dd",后来发现--where作用域是所有表,所以只能把有条件限定的表单独导出。 -如果触发器报错要加上--skip-triggers 导出数据还算顺利,导入的时候发生了错误。 导入命令: <code> mysql -u数据库账户名 -p数据库密码 数据库名 < backup.sql </code> 结果报错ERROR 2006 (HY000) at line 896: MySQL server has gone away。开始以为数据太大了服务崩溃,因为sql数据有5个多G,于是尝试先导入一些小的表,报错依然存在。 改为mysql -u数据库账户名 -p数据库密码 登录到本地数据库内然后执行sorce backup.sql 结果提示ERROR 1231 (42000): Variable 'time_zone' can't be set to the value of 'NULL',问了下AI跟我说是导出的数据头部信息问题,折腾了好半天一直不成功。 找到问题: 由于删光了导出的sql额外信息只留了insert语句报错依然存在,开始怀疑是数据本身的问题。最终发现由于项目早期数据结构设计不合理,有个超大blob字段单个数据超过了30M引发了一系列问题。 解决方案: 修改了数据库配置文件 mysql/conf/mysqld.cnf,加了max_allowed_packet=256M,重启数据库后导入成功! 另外发现mysql -u数据库账户名 -p数据库密码 数据库名 < 数据库文件.sql 的导入方式比登录数据库后用sorce 数据库文件.sql的方式快很多。 导出的时候加上 --set-gtid-purged=off参数可以减少一些奇怪的额外信息导出,避免奇怪报错。 导出的时候加上 -d参数可以只导出表结构不导出数据,加上 -t 则只导出数据不导出建表语句。 还有一个需要注意的是,docker exec 执行mysql容器数据导入导出的时候要加-i参数,不是-it。完整语句应该类似: docker exec -i 容器名称 mysqldump -u账户名 -p密码 --single-transaction --quick 数据库名 表名 > 自定义导出文件名.sql 由于 > 符号执行优先级问题,最终数据是导出在宿主机的而不是容器内。
更多>>
解决DNS解析慢的后续 写了个工具网站 关于谷歌chrome输入域名默认跳https的问题 上传文件时nginx网络状态码499无响应 php使用mb_detect_encoding字符编码识别不准确的问题