备份还原案例
前提:log_bin=ON
一、早上上班后误删数据库,如何恢复最新状态
1、假设早上已经完成备份 (开启二进制),然后在students表里新增了一条数据
[root@centos7 ~]#mysqldump -A -F --single-transaction --master-data=2 > /backup/full.sql
MariaDB [hellodb]> insert students values (26,'laobai',30,'M',7,2);
2、然后在10点时,误删数据库 ;用户在访问 students表 的时候 提示错误,表找不到,然后其他用户又新增一个表
MariaDB [hellodb]> drop table students;
MariaDB [hellodb]> insert teachers values(5,'mht','46','M');
MariaDB [hellodb]> select * from students; ERROR 1146 (42S02): Table 'hellodb.students' doesn't exist
3、为了防止问题继续扩大,我们先上个只读锁,禁止用户修改。
MariaDB [(none)]> flush table with read lock;
4、我们先查看此时的日志文件
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30343 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 7698 |
| mysql-bin.000004 | 773 |
+------------------+-----------+
5、为了区分新旧日志,我们刷新一下日志
MariaDB [(none)]> flush logs;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30343 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 7698 |
| mysql-bin.000004 | 816 |
6、我们查看一下二进制文件,确认是第四个文件且编号为245的文件 ,然后将文件导入至backup目录下
[root@centos7 ~]#less /backup/full.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=245;
[root@centos7 ~]#mysqlbinlog --start-position=245 /date/binlog/mysql-bin.000004 > /backup/bin.sql
7、上部操作是将全部备份 加上 出故障之间的备份文件导了出来,我们还需要找到删除表的记录并删除,然后利用二进制文件进行恢复 ,发现表已经全部恢复。
[root@centos7 backup]#vim /backup/bin.sql #将删除表的指令删除 [root@centos7 backup]#rm -rf /date/mysql/* #删库(删之前一定要确认有备份) [root@centos7 backup]#systemctl restart mariadb [root@centos7 backup]#mysql < /backup/full.sql #将全备份还原 [root@centos7 backup]#mysql < /backup/bin.sql #将修改过的文件还原 [root@centos7 backup]#mysql Database changed MariaDB [hellodb]> select * from teachers -> ; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | mht | 46 | M | +-----+---------------+-----+--------+ MariaDB [hellodb]> select * from students; +-------+---------------+-----+--------+---------+-----------+ | StuID | Name | Age | Gender | ClassID | TeacherID | +-------+---------------+-----+--------+---------+-----------+ | 1 | Shi Zhongyu | 22 | M | 2 | 3 | | 2 | Shi Potian | 22 | M | 1 | 7 | | 3 | Xie Yanke | 53 | M | 2 | 16 | | 4 | Ding Dian | 32 | M | 4 | 4 | | 5 | Yu Yutong | 26 | M | 3 | 1 | | 6 | Shi Qing | 46 | M | 5 | NULL | | 7 | Xi Ren | 19 | F | 3 | NULL | | 8 | Lin Daiyu | 17 | F | 7 | NULL | | 9 | Ren Yingying | 20 | F | 6 | NULL | | 10 | Yue Lingshan | 19 | F | 3 | NULL | | 11 | Yuan Chengzhi | 23 | M | 6 | NULL | | 12 | Wen Qingqing | 19 | F | 1 | NULL | | 13 | Tian Boguang | 33 | M | 2 | NULL | | 14 | Lu Wushuang | 17 | F | 3 | NULL | | 15 | Duan Yu | 19 | M | 4 | NULL | | 16 | Xu Zhu | 21 | M | 1 | NULL | | 17 | Lin Chong | 25 | M | 4 | NULL | | 18 | Hua Rong | 23 | M | 7 | NULL | | 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | | 26 | laobai | 30 | M | 7 | 2 | +-------+---------------+-----+--------+---------+-----------+
二、Xtrabackup + InnoDB == 完全热备 + 增量备份
1、修改配置文件
[root@centos7 backup]#vim /etc/my.cnf [mysqld] log_bin # 开启二进制 datadir=/var/lib/mysql # 指定数据库目录 socket=/var/lib/mysql/mysql.sock innodb_file_per_table # 每个数据库和表都是独立文件 skip_name_resolve=ON # 不做反向名词解析
2、完全备份
[root@centos7 ~]#innobackupex --user=root /backup/ # 这里省略了密码
3、完全备份数据库,将备份数据复制到其他主机 并整理数据
[root@centos7 backup]#scp -r /backup/ 192.168.95.3:/ #将完全备份复制到远程主机上 ,由于备份的是文件夹,要加 -r
[root@laobai ~#innobackupex --apply-log /backup/2018-06-17_23-05-18/ # 在远程主机整理数据,将已经提交的事物redo ,未提交的事物撤销操作
4、清空默认安装路径下的文件,重启服务,查看数据库,发现数据库只有默认的几个。
[root@laobai ~#rm -rf /var/lin/mysql/*
[root@laobai ~#rm -rf /data/mysqldb/* #centos6 的系统删除路径
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| laobai |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
5、停止mysql服务 ,开始整理数据(将已经提交的事物 redo,未提交的事物撤销)
[root@laobai ~#innobackupex --apply-log /backup/2018-06-17_23-05-18/ #整理数据
6、将整理过后的数据复制到默认的数据库目录内 ,并给与所有者和所有组权限。
[root@laobai /data/mysqldb#innobackupex --copy-back /backup/2018-06-17_23-05-18/
[root@laobai /data/mysqldb#chown -R mysql.mysql /data/mysqldb/
[root@laobai /data/mysqldb#ll /data/mysqldb/
7、重启数据库服务,检查数据库 ,发现已经还原
[root@laobai /data/mysqldb#service mysqld start MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | hellodb | | information_schema | | laobai | | mysql | | performance_schema | +--------------------+
三、完全热备+增量备份和还原
1、完全备份
[root@centos7 ~]#innobackupex --user=root /backup/ # 这里省略了密码
2、修改数据
MariaDB [(none)]> create database hei; #创建一个数据库
3、创建增量备份的目录 ,完成第一次增量备份
[root@centos7 ~]#mkdir /backup/inc{1,2}
[root@centos7 ~]#innobackupex --incremental /backup/inc1/ --incremental-basedir=/backup/2018-06-17_23-05-18/
4、接着我们又对数据进行修改
MariaDB [hellodb]> insert students values (27,'mht',45,'M',4,5); #在students表了增加一条数据 MariaDB [(none)]> drop database bai; #删除一个数据库
5、第二次增量备份
[root@centos7 ~]#innobackupex --incremental /backup/inc2/ --incremental-basedir=/backup/inc1/2018-06-18_18-04-17/
6、备份到远程主机
切换到远程主机
[root@laobai ~]#rm -rf /backup/ # 清空原有备份文件 [root@laobai ~]#rm -rf /var/lib/mysql/* #清空原有数据库文件 [root@laobai ~]#service mysqld stop # 停止数据库服务 Stopping mysqld: [ OK ] [root@centos7 ~]#scp -r /backup/ 192.168.95.3:/ #在原主机将备份文件拷贝至远程主机
7、恢复
[root@laobai /backup]#innobackupex --apply-log --redo-only /backup/2018-06-17_23-05-18/ #整理完全备份的数据,将已提交的事物日志整合到数据库文件内,保留未提交事物;所以一定要记得加"--redo-only"选项
[root@laobai /backup]#innobackupex --apply-log --redo-only /backup/2018-06-17_23-05-18/ --incremental-dir=/backup/inc1/2018-06-18_18-04-17/ #在完全备份的基础上将增量备份导入到一块,这里是最新的增量备份
[root@laobai /backup]#innobackupex --apply-log --redo-only /backup/2018-06-17_23-05-18/ --incremental-dir=/backup/inc2/2018-06-18_20-15-24/ #将第二次增量备份整合到一块
8、复制数据库到默认目录内,并给与mysql权限
[root@laobai ~]#innobackupex --copy-back /backup/2018-06-18_22-14-17/
[root@laobai ~]#chown -R mysql.mysql /var/lib/mysql/* [root@laobai ~]#service mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ]
9、测试是否恢复成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hei | #第一次新建的hei已经恢复
| hellodb |
| laobai |
| mysql |
| performance_schema |
+--------------------+
mysql> select * from students;
| 19 | Xue Baochai | 18 | F | 6 | NULL | | 20 | Diao Chan | 19 | F | 7 | NULL | | 21 | Huang Yueying | 22 | F | 6 | NULL | | 22 | Xiao Qiao | 20 | F | 1 | NULL | | 23 | Ma Chao | 23 | M | 4 | NULL | | 24 | Xu Xian | 27 | M | NULL | NULL | | 25 | Sun Dasheng | 100 | M | NULL | NULL | | 27 | mht | 45 | M | 4 | 5 | #第二次插入的数据也恢复了 +-------+---------------+-----+--------+---------+-----------+
四、使用Xtrabackup实现表单备份(必须在mariadb12.15版本才能使用)
1、备份单表
~]# innobackupex --include="testdb.testlog" /backup #备份表数据 ~]# mysql -e 'SHOW CREATE TABLE testdb.testlog' > /backup/desc_testdb_testlog.sql #备份表空间 ~]# mysql -e 'DROP TABLE testdb.testlog' #模拟故障,删除testlog表
2、还原单表
~]# innobackupex --apply-log --export /backup/2018-06-14_17-47-02/ #整理表数据 ~]# vim /backup/desc_testdb_testlog.sql #编辑创建表空间的语句,删除以下字段 Table Create Table testlog ~]# mysql testdb < /backup/desc_testdb_testlog.sql #导入表空间 ~]# mysql testdb -e 'DESC testlog' #查看是否导入成功 +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(30) | YES | | NULL | | | age | int(11) | YES | | 20 | | +-------+----------+------+-----+---------+----------------+ ~]# mysql -e 'ALTER TABLE testdb.testlog DISCARD TABLESPACE' #清除表空间 ~]# cd /backup/2018-06-14_17-47-02/testdb/ testdb]# cp testlog.cfg testlog.exp testlog.ibd /var/lib/mysql/testdb/ #将表数据复制到库目录 ~]# chown -R mysql:mysql /var/lib/mysql/testdb/ #修改所属者和所属组 ~]# mysql -e 'ALTER TABLE testdb.testlog IMPORT TABLESPACE' #导入表空间