mysqldump备份后,需要在数据库启动时倒入数据,倒入数据后数据库密码将变成备份时所使用的数据库密码,而不是现在所使用的数据库密码。
语法:mysqldump -h服务器 -u用户 -p密码 数据库名 >备份文件.sql
参数:-A , --all-databases 所有库
database1 数据库名
database2 table1 table2 数据库database2的两个表
-B ,--databases database1 database2 database3 多个数据库
--single-transaction innoDB一致性 服务可用性
--master-data=1|2 该选项会记录binlog的日志位置与文件名并追加到文件中
--flush-logs 备份之前刷新日志,截断日志
--master-data 这个选项可以把备份到什么时候的binlog的位置和文件名添加到输出中,mysqldump在导出数据时,当--master-data=1时,就会打印成一个change master to命令,后跟位置和文件名,--master-data=2时,会将change master to命令加上注释。同时--master-data会自动打开--lock-all-tables选项,此时就需要配合--single-transaction选项。(简单来说,--master-data命令是帮我们将备份到什么位置的信息自动写入到master.info文件中,如果不加这个选项,就需要我们自己手动去锁表,查看binlog所备份到的位置和文件名,然后我们通过change master to命令写入master.info文件中。)
==备份
#mysqldump -udumpuser -pdumppassword \
--all-databases --single-transaction \
--master-data --flush-logs \
> /backup/`data +%F-%H`-mysql.sql
此时备份的只是现在这个时间段数据库中的数据,之后到数据库损坏的数据需要通过二进制日志来恢复。
#vim /backup/xxx-mysql.sql 查看二进制日志截断的位置。
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000004', MASTER_LOG_POS=154;
cp /var/lib/mysql/*bin* ~ 复制二进制日志到当前目录下,若二进制日志过多,也可只复制上边观察到的截断和截断之后的二进制日志。
==恢复(需要启动数据库)
①删除损坏数据库的数据和日志或者使用新的数据库,启动数据库修改初始密码。
mysql -uroot -p'newpassword' < /backup/xxx-mysql.sql
mysql -uroot -p'newpassword' -e 'flush privileges'
此时数据库密码已经变成旧密码了。新密码已经登录不上去了。
②上述方式恢复时会产生二进制日志,可以通过这种方式避免产生二进制日志。
在数据库中执行以下命令。
set sql_log_bin=0 暂时关闭二进制日志
source /backup/xxx-mysql.sql
set sql_log_bin=1 开启二进制日志文件
==二进制恢复备份到数据库损坏时候的数据
mysqlbinlog localhost-bin.0000004 localhost-bin.0000005 --start-position=154 | mysql -udumpuser -pdumppassword
此处的日志文件需要把备份之后所产生的文件都要写上。--start-position是之前备份文件中观察到的。此时就恢复到数据库损坏的时候了。