mysqldump
- 语法:
mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql
-
参数说明:
- 库的范围:
-A, --all-databases 所有库 school 数据库名 school stu_info t1 是指school数据库的表stu_info、t1 -B, --databases bbs test mysql 多个数据库 --single-transaction #InnoDB 一致性 服务可用性 --master-data=1|2 #该选项将会记录binlog的日志位置与文件名并追加到文件中,或添加注释
- 高级选项
--opt #同时启动各种高级选项 -R, --routines #备份存储过程和存储函数 -F, --flush-logs #备份之前刷新日志,截断日志。备份之后新binlog。 --triggers #备份触发器 mysqldump --help 帮助
备份
[root@localhost ~]# mysqldump -p'liweiqiang@123' \
--all-databases --single-transaction \
--master-data=2 \
--flush-logs \
> /backup/`date +%F-%H`-mysql-all.sql (把所有的库备份到 /backup/当前时间)
备份出来的文件:
vim /backup/2016-11-25-14-mysql-all.sql
LOCK TABLES `user` WRITE; 观察各种锁机制,用来保证数据一致性 锁表机制(让边只读不可写,很快备份完就解锁)
22 CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000004', MASTER_LOG_POS=154; (22行告诉你备份到数据的哪里154之后的数据没有备份)
二进制日志截断位置。第22行
业务正常推进...
重启数据库服务切断二进制日志
恢复
恢复:
1 备份二进制日志文件
cp /var/lib/mysql/*bin* ~
2. 停止数据库
systemctl stop mysqld
3. 清理环境
rm -rf /var/lib/mysql/*
4.启动数据库
systemctl start mysqld
grep 'password' /var/log/mysqld.log
找密码,再改一下密码。请使用密码和以前的不一样的
mysqladmin -uroot -p'Kyzw;u2dq<mh' password 'liweiqiang@1234'
注意
语法要求password后面有空格。
5.mysql恢复数据
mysql -p'liweiqiang' < /backup/2016-12-08-04-mysql-all.sql
登陆并验证数据恢复结果。请思考恢复的数据库有几个?
1个
二进制日志恢复
观察二进制截取记录
vim /backup/2016-11-25-14-mysql-all.sql
CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.0000010', MASTER_LOG_POS=154;
mysqlbinlog localhost-bin.000002 localhost-bin.000003
--start-position=154 | mysql -p'liweiqiang@123' (用二进制日志恢复数据)
注意后续有多少日志,要跟多少日志名字。
7.观察数据
请思考数据是否恢复完整。
是完整的。
8.请思考误删除的问题
如何保留testdb3库
[root@localhost ~]#mysqlbinlog localhost-bin.00004 ......005.....006...... > 1.txt
删除1.txt中不需要的at(比如test3库是误操作)
cat 1.txt | mysql -p'liweiqiang@123'
课后题:是否可以通过mysqlbinlog start 和stop 命令解决。
9.关于数据恢复时的多余日志。
方法一
原因
每次还原数据库都会增加日志的体积。但这些都是还原操作。恢复数据库的日志占用了存储空间。
mysql> set sql_log_bin =0 (关闭二进制日志 这样恢复的操作就不会记录到二进制日志里面)
再mysql> source /backup/*.sql (在数据库里面执行备份文件 source)
观察
二进制日志并没有发生变化。
方法二
在备份文件中,加入关闭二进制日志。