mysqldump

mysqldumpMySQL 自带的逻辑备份工具。

备份命令

格式

1
mysqldump [选项] 数据库名 [表名] > 脚本名

1
mysqldump [选项] --数据库名 [选项 表名] > 脚本名

1
mysqldump [选项] --all-databases [选项]  > 脚本名

选项说明

参数名缩写含义
–host-h服务器 IP 地址
–port-P服务器端口号
–user-uMySQL 用户名
–pasword-pMySQL 密码
–databases指定要备份的数据库
–tables指定要备份的表
-t只导出表数据不导出表结构
-d只导出表结构不导出表数据
–where指定导出特定条件的语句
–all-databases备份 mysql 服务器上的所有数据库
–compact压缩模式,产生更少的输出
–no-create-db/–no-create-info禁止生成创建数据库语句
–default-character-set指定默认字符集
–add-locks备份数据库表时锁定数据库表
–lock-tables备份前,锁定所有数据库表
–single-transaction将事务隔离级别设置为RR(repeatable read)

实例

备份指定数据库 core 的指定表 user ,并设置默认字符集为 utf8

1
mysqldump -uroot -p --databases core --tables user --default-character-set=utf8> D:\user.sql

恢复命令

格式

1
mysql > source sql文件绝对路径

需要提前创建好数据库,并在当前数据库下

1
2
mysql > use core
mysql > source D:\user.sql

问题

1、命令行导入 sql 文件报错 Unknown command ‘\n’

选择需要导入到数据库

1
use core;

导入数据库

1
source D:\core.sql

出现报错

解决

登录时指定字符集

1
mysql -uroot -p123456 --default-character-set=utf8

2、备份数据提示 Table ‘xxx’ was not locked with LOCK TABLES (1100)

备份数据时希望备份指定的数据

1
mysqldump -uroot -p123456 uqbike-core recharge -t --where "userId in (SELECT userId from user where accountId in (100001,100002,100003))" --default-character-set=utf8 >D:\recharge.sql

在一个会话中,只能访问已经锁定的表,即recharge表不能访问未锁定的表user,所以会提示错误ERROR 1100

解决

加上参数 --single-transaction ,设置事务的隔离级别为可重复读

1
mysqldump -uroot -p123456 uqbike-core recharge -t --single-transaction --where "userId in (SELECT userId from user where accountId in (100001,100002,100003))" --default-character-set=utf8 >D:\recharge.sql

3、The total number of locks exceeds the lock table size

对 Mysql 中的表进行大批量插入时遇到了这个问题,翻译过来是表的总数超过了锁定表的大小。一般出现这个原因会有两种可能:

  • 临时表过小(tmp_table_size)

查看临时表的大小

1
show variables like "tmp_table_size";

自行设置大小

1
SET GLOBAL tmp_table_size =1024*1024*1024
  • innodb 缓冲池过小(innodb_buffer_pool_size)

查看大小

1
show variables like "innodb_buffer_pool_size";

自行设置大小

1
SET GLOBAL innodb_buffer_pool_size=1024*1024*1024;