Linux九阴真经之九阴白骨爪残卷14(备份和恢复)

备份还原案例

 前提: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'  #导入表空间
 
原文地址:https://www.cnblogs.com/huxiaojun/p/9193806.html