在使用Docker搭建环境时,分别创建多个容器,mysql,redis,web等。所有容器启动后发现web容器连接不上mysql容器,返回ERROR 2002。无论如何重建容器也不能解决,但如果只是重启mysql容器,web容器就可以连接上,不过数据库中缺少大量表,所以怀疑是sql文件过大导致Docker假死,连接失败。经尝试后发现的确是sql文件过大的原因,sql文件有6万4千多行,整个迁移过程大约20左右。
大sql文件的导入方法
- 连接数据库
mysql -uroot -psecret -hmysqlhost
- 修改配置
set global net_buffer_length=1000000; --Set network buffer length to a large byte number
set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number
set foreign_key_checks = 0; --Disable foreign key checking to avoid delays,errors and unwanted behaviour
- 导入文件
use dbname;
source path/to/bak.sql;
- 恢复配置
set foreign_key_checks = 1;
- 可能遇见的问题与解决方法
Tablespace for table '`dbname`.`tablename`' exists. Please DISCARD the tablespace before IMPORT.
//导入到大概100个表左右时可能会出现ERROR,导入过程中断
//解决方案:删除mysql对应表缓存,一般位于/var/lib/mysql/数据库名/表名,移除他再执行剩下的迁移即可。
//对较大的迁移文件可分割为多个小文件后再迁移
新建一个all.sql
vim all.sql
在里面写入:
source 1.sql
source 2.sql
......
source 53.sql
source 54.sql
然后只要
mysql> source all.sql
少量数据快速迁移
mysql -uroot -psecret -hmysqlhost dbname < /path/to/bak.sql