mysqldump 属于MySQL客户端工具
mysqldump备份工具对于MyISAM存储引擎实现备份是温备份,对innodb存储引擎是可以实现热备份。
使用mysqldump备份数据库可以实现完全备份 + 二进制日志文件,这样也算是完全备份 + 增量备份。
首先将这个数据库备份下来这就是完全备份,然后以后数据的变化再每天进行对二进制日志进行备份这就是增量备份。
mysqldump命令的使用:
用法mysqldump + 选项 +要备份的数据库
常用选项:
db_name:备份指定数据库如果备份数据库中某张表,db_name [tb_name] 备份时候并不包含创建数据库命令,意味着以后想还原数据时候需要手动创建数据库。
比如我们备份一个叫做file的数据库:
假如Linux下面我们可以这样
mysqldump -u root -p file >/root/sql/file.sql
这里叫表示备份到/root/sql/目录下,命名为file.sql
windows下备份
mysqldump -u root -p file > D:\sqlback\file.sql
备份好之后我们就可以使用文本编辑器打开了
可以看到mysqldump的备份是将整个表中的数据备份为批量插入的insert语气。因此以后如果你删除了你所备份的数据库。想导入你备份的数据库是导入不了的,它里面没有创建数据库的命令。
例如我想尝试导入一个备份数据库:
在Linux下面直接切换到备份数据路径下执行mysql < file.sql
现在我们创建一个叫做china的数据库再将MySQL版中国省市区数据导入
mysql -u root -p china < MySQL版中国省市区数据表.sql
这样执行表示导入这个MySQL版中国省市区数据表.sql备份数据到我们的china库中
这种备份必须要在数据库在线的情况下才能备份,如果此时数据库非常繁忙时候时时刻刻都有写入操作的话,千万不能用这种方式进行备份,我们应该先进行锁表再备份。步骤如下:
首先使用mysql客户端连接上mysql以后,执行下面两句
lock tables; #锁表,所有的表不能再写入数据。可以读数据
flush tables; #将内存中的数据刷新保存到硬盘
或者执行flush tables with read lock;
备份完之后执行解锁表命令,务必记得
unlock tables;
--master-data=n
n的取值范围为0-2 0表示不记录二进制日志文件以及路径位置
1表示以change master to 的方式记录位置,可用于恢复启动后直接启动从服务器
2表示 以change master to的方式记录位置,但是默认为被注释掉
比如:
mysqldump -u root -p --master-data=2 file >D:\sqlback\file `date+ %F-%H-%M-%S`.sql
这里表示备份file库到指定路径下面以当前时间命名
如果报错:mysqldump: Error: Binlogging on server not active
表示没有开启二进制日志,需要在配置文件开启
通过这种方式备份以后。我们可以看到sql文件周会有一行
--change master to master_log_file='当前二进制日志文件名' master_log_pos=事件日志位置'
下次从二进制日志中备份数据时候就可以从这个二进制文件的这个位置往下备份就行了
--lock-tables表示自动锁定所有表,如果我们只是备份单个库而锁定所有表的话,这样是不合理的,我们可以使用这个选项。单独登陆mysql客户端锁定单张表,再进行备份
--flush_logs:备份之前自动执行日志刷新到磁盘
如果指定库中所有表的存储引擎均为innodb可以使用
--single-transaction启动热备份,启动热备份就无需我们手动锁表
备份多个库:
--all-databases; 备份所有库
--databases db_name1,db_name2,,,,, ; 备份多个库
这两个命令备份会创建数据库命令,因此还原时候就不需要再手动创建了
例如:
mysqldump -u root -p --single-transaction --all-databases --master-data = 2 --flush-logs >D:\sqlback\all.sql
这个表示我们将使用热备份将所有的库备份到D盘下面,命名为all.sql
--events : 事件
--routines :存储过程,存储函数
--triggers:触发器