共计 2875 个字符,预计需要花费 8 分钟才能阅读完成。
丸趣 TV 小编给大家分享一下 MySQL 如何实现备份与恢复,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
实验环境:RHEL5.8 ,SElinux 关闭,MySQL 是 tar 包初始化安装版本 5.5.28
一. 测试环境准备
1.1 mysql 的安装就不说了,见 http://www.linuxidc.com/Linux/2012-04/58990.htm
1.2 编缉 /etc/my.cnf 把二进制日志存放目录改到其它非数据目录,innodb 每表一文件
建立一目录用于存放二进制日志
mkdir /mybinlog
chown mysql:mysql /mybinlog
修改 my.cnf
vim /etc/my.cnf
log-bin=/mybinlog/mysql-bin ## 二进制日志目录及文件名前缀
innodb_file_per_table = 1 ## 启用 InnoDB 表每表一文件,默认所有库使用一个表空间
启动 mysqld
service mysqld start
1.3 创建一个测试库与测试表
mysql create database laoguang;
mysql use laoguang;
mysql create table linux (id tinyint auto_increment primary key,name char(10));
mysql insert into linux (name) values (apache),(nginx),(php
1.4 创建用于存放备份的目录
mkdir /myback
chown -R mysql:mysql /myback
二, 用 mysqldump 实现备份
2.1 mysqldump 用来温备,所以我们得为所有库加读锁, 并且滚动一下二进制日志,并记录当前二进制文件位置
mysqldump –all-databases –lock-all-tables –routines –triggers –master-data=2 \
–flush-logs /myback/2012-12-3.19-23.full.sql
–all-tables 备份所有库
–lock-all-tables 为所有表加读锁
–routinge 存储过程与函数
–triggers 触发器
–master-data=2 在备份文件中记录当前二进制日志的位置,并且为注释的,1 是不注释掉在主从复制中才有意义
–flush-logs 日志滚动一次
查看有没有备份成功,有没有启用新二进制的日志,查看备份的文件中有没有记录完整备份后二进制的位置
备份二进制日志
cp /mybinlog/mysql-bin.000001 /myback/2012-12-3.19-23.full.00001
2.2 模拟数据库意外损坏,测试完整恢复
rm -rf /data/mydata/*
rm -rf
/mybinlog/*
初始化 mysql 并启动 mysql
cd /usr/local/mysql
./scripts/mysql_install_db –user=mysql–datadir=/data/mydata
rm -rf /mybinlog/* ## 因为我们不是全新初始化的,可能会有报错的二进制日志,我们不需要
service mysqld start ## 启动时会重新生成新的二进制日志的
恢复到备份状态, 备份前先关闭对恢复过程的二进制日志记录,因为记录恢复语句是毫无意义的
mysql set global sql_log_bin=0;
mysql /myback/2012-12-3.19-23.full.sql ## 如果有账号密码记的 -u - h 哦
打开记录并查看恢复状况
mysql set global sql_log_bin=1;
mysql show databases;
打开二进制记录并查看恢复状况
mysql set global sql_log_bin=1;
mysql show databases;
2.3 模拟一种场景,我往 linux 表中新添加了数据,然后不小心将这个表删了,我们要恢复到删除之前的状态,并且新加的数据还存在。
2.3.1 新增数据
mysql use laoguang;
mysql insert into linux (name) values (haddop), (mysql
mysql drop table linux;
mysql show master status; ## 查看当前所在二进制日志中的位置
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000001 | 9005 | | |
+——————+———-+————–+——————+
我们先恢复完整数据,再恢复完整备份后到删除之前的数据,对应二进制日志就是完整备份后的二进制日志位置到删除表之前的位置
2.3.2 先恢复完整备份,同样恢复过程不要记录日志
mysql set global sql_log_bin=0;
mysql /myback/2012-12-3.19-23.full.sql
2.3.3 查看删除表时的记录位置
mysqlbinlog /mybinlog/mysql-bin.000001
# at 8893
#121202 14:14:07 server id 1 end_log_pos 9005 Query thread_id=5exec_time=0error_code=0
SET TIMESTAMP=1354428847/*!*/;
DROP TABLE `linux` /* generated by server */
/*!*/;
DELIMITER ;
# End of log file
2.3.4 由上图可知删除是在 8893 时做的,将二进制文件中完整备份到删除表之前的记录导出
mysqlbinlog –stop-position=8893 /mybinlog/mysql-bin.000001 /tmp/change.sql
–start-position 指定从哪开始导出二进制日志
–stop-position 指定到哪结束
–start-datetime 从哪个时间开始格式如 2005-12-25 11:25:56
–stop-datetime 到哪个时间结束
由于这个二进制日志是我们完整恢复后才启用的,所以我们直接从头开始即可,如果你的二进制日志很多,请查看完整备份中记录的备份时的位置,从那开始到删除之前即可
将这段二进制记录应用到 mysql 的库中
mysql /tmp/change.sql
进入数据库查看数据有没有恢复
mysql select * from linux;
看完了这篇文章,相信你对“MySQL 如何实现备份与恢复”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!