mysql的备份和恢复
备份类型:
完全备份指的是备份整个数据集( 即整个数据库 )
部分备份指的是备份部分数据集(例如: 只备份一个表)
增量备份指的是备份自上一次备份以来(增量或完全)以来变化的数据; 特点: 节约空间、还原麻烦
差异备份指的是备份自上一次完全备份以来变化的数据 特点: 浪费空间、还原比增量备份简单
备份策略:
本文介绍第一种备份方法,使用系统自带的工具mysqldump,mysqldump只支持全量备份
mysqldump:
全量+binlog
MyISAM存储引擎:支持温备,备份时要锁定表;
-x, --lock-all-tables:锁定所有库的所有表,读锁;
-l, --lock-tables:锁定指定库所有表;
InnoDB存储引擎:支持温备和热备;
--single-transaction:创建一个事务,基于此快照执行备份;
其它选项:
-R, --routines:备份指定库的存储过程和存储函数;
--triggers:备份指定库的触发器;
-E, --events:
--master-data[=#]
1:记录为CHANGE MASTER TO语句,此语句不被注释;
2:记录为CHANGE MASTER TO语句,此语句被注释;
--flush-logs:锁定表完成后,即进行日志刷新操作;
1、首先我们创建一个数据库和属于这个数据库的某个表
MariaDB [(none)]> create database hidb;
MariaDB [(none)]> use hidb; MariaDB [hidb]> create table students(id int unsigned auto_increment primary key,name char(30) not null,age tinyint unsigned,gender ENUM(‘F‘,‘M‘),major varchar(200)); MariaDB [hidb]> desc students;查看表结构
2、然后向表中插入一些数据
创建一个数组,给hidb这个库中的students表中自动添加一些内容,要求姓名自动递增,年龄对80取模加上18,性别定义数组随机为F或M
[root@bixia ~]#GENDER=(‘F‘ ‘M‘) [root@bixia ~]#echo ${GENDER[0]} [root@bixia ~]#echo ${GENDER[1]} [root@bixia ~]#for i in {1..1000}; do mysql -e "insert into hidb.students(id,name,age,gender) values(‘$i‘,‘stu$i‘,‘$[$RANDOM%80+18]‘,‘${GENDER[$RANDOM%2]}‘);";done MariaDB [hidb]> select * from students; ..... ..... ..... | 998 | stu998 | 38 | F | NULL | | 999 | stu999 | 91 | F | NULL | | 1000 | stu1000 | 80 | M | NULL | +------+---------+------+--------+--------------+
3、最后启动二进制日志
创建一个目录存放数据和日志文件
[root@bixia ~]#mkdir -pv /mydata/{data,logs} mkdir: created directory ‘/mydata’ mkdir: created directory ‘/mydata/data’ 存放数据 mkdir: created directory ‘/mydata/logs’ [root@bixia ~]#chown -R mysql.mysql /mydata/* 将/mydata/目录下的所属者和所属组改为mysql [root@bixia ~]#vim /etc/my.cnf.d/server.cnf 编辑配置文件指定二进制日志存放的路径 [server] log_bin = /mydata/logs/master-log 不用加后缀 [root@bixia ~]#systemctl restart mariadb 重启服务让日志文件生效 [root@bixia ~]mysql MariaDB [hidb]> set @@session.sql_log_bin=on; 启动二进制日志记录 MariaDB [hidb]> grant all on *.* to root@‘172.18.77.%‘ identified by ‘centos‘; 授权用户可以通过远程登录连接
4、上述所有的环境以经准备就绪了;接下来我们准备另外一台服务器以供备份数据
[root@bixia ~]#mysqldump -uroot -pcentos -h172.18.77.7 --single-transaction -R --triggers -E --databases hidb --master-data=2 --flush-logs > /root/hidb-$(date +%F-%H-%M-%S).sql
[root@bixia ~]#mysql < hidb-2017-11-14-11-38-09.sql 备份恢复
到这里就备份完成了,但是如何在备份从这里已经备份的之后的数据呢 ,这就是增量备份了,利用二进制日志进行备份
5、我们来模拟一下,比如我们在原来的主的mysql服务器上分别删除一行数据个插入一行数据
MariaDB [hidb]> delete from students where id=999; MariaDB [hidb]> insert into students (name,age,gender) values (‘Huangshang‘,‘30‘,‘M‘);
在另外一台主机上的备份数据库中是看不到这些删除和插入的数据的
[root@bixia ~]#less hidb-2017-11-14-11-38-09.sql 查看这二个文件可以看到从哪里开始增填新的内容,以供参考备份使用
匹配到是master-log.000006这个日志,从245字节开始
[root@bixia logs]#mysqlbinlog -j 245 master-log.000006 > /tmp/binlog.sql [root@bixia logs]#scp /tmp/binlog.sql 172.18.77.77:/root/
[root@bixia ~]#mysql < binlog.sql 备份恢复
6、最后登录查看
在主服务器上删除的999行数据和新插入的一行数据已经备份到最新的数据了
注意:由于上述两台主机的主机名都是bixia,所以有可能区分不了哪台是主的mysql,哪个是用于备份的mysql主机,为了方便自己分的清楚建议修改主机名不一样,以防混淆。
原文:http://13157090.blog.51cto.com/13147090/1981628