• MySQL学习笔记22


    mysqldump+binlog实现增量备份:

    1、什么是增量备份的核心思路?

    1):先有全量备份;

    2):继续有增删改数据;

    3):再次需要备份的时候,不需要进行全量备份,只需要备份binlog日志文件即可。(因为binlog日志记录了增删改操作的所有SQL语句。)

    增量备份的实验步骤:

    第一步:准备数据;

    第二步:开启二进制日志,然后做全库备份;

    第三步:继续对数据库进行增删改操作;

    第四步:突然发生了硬件故障,数据库丢失;

    第五步:恢复全量备份导出的数据(数据不完整,可能只有90%)

    第六步:备份二进制日志,根据其信息(导入剩余的10%的数据)恢复数据。

    增量备份的具体实现:

    第一步:准备数据:

    1. use db_itheima;
    2. create table tb_student (
    3. id int not null auto_increment,
    4. name varchar(20),
    5. age tinyint unsigned default 0,
    6. gender enum('male','female'),
    7. subject enum('ui','java','yunwei','python'),
    8. primary key(id)
    9. )engine=innodb default charset=utf8;
    10. insert into tb_student values (null,'刘备',33,'male','java');
    11. insert into tb_student values (null,'关羽',32,'male','yunwei');
    12. insert into tb_student values (null,'张飞',30,'male','python');
    13. insert into tb_student values (null,'貂蝉',18,'female','ui');
    14. insert into tb_student values (null,'大乔',18,'female','ui');
    15. mysql> select * from tb_student;
    16. +----+--------+------+--------+---------+
    17. | id | name | age | gender | subject |
    18. +----+--------+------+--------+---------+
    19. | 1 | 刘备 | 33 | male | java |
    20. | 2 | 关羽 | 32 | male | yunwei |
    21. | 3 | 张飞 | 30 | male | python |
    22. | 4 | 貂蝉 | 18 | female | ui |
    23. | 5 | 大乔 | 18 | female | ui |
    24. +----+--------+------+--------+---------+
    25. 5 rows in set (0.00 sec)

    第二步:开启二进制日志,重启服务,然后进行全库备份。

    service mysql_3306 restart命令重启mysql。 

    再确认下其中的二进制日志:

    在做增量备份的时候刷新下二进制日志。

    这个场景就是刷二进制日志的一个作用。

    1. [root@mysql-server data]# rm -rf /tmp/sqlbak/*
    2. [root@mysql-server data]# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/sqlbak/all.sql -p
    3. Enter password:
    4. [root@mysql-server data]# ll /tmp/sqlbak
    5. total 872
    6. -rw-r--r-- 1 root root 890067 Sep 29 07:04 all.sql

    第三步:继续对数据库进行增删改操作:

    1. mysql> use db_itheima;
    2. Reading table information for completion of table and column names
    3. You can turn off this feature to get a quicker startup with -A
    4. Database changed
    5. mysql> insert into tb_student values(null, '小乔', 16, 'female', 'ui');
    6. Query OK, 1 row affected (0.01 sec)
    7. mysql>
    8. mysql> delete from tb_student where id=3;
    9. Query OK, 1 row affected (0.00 sec)
    10. mysql> select * from tb_student;
    11. +----+--------+------+--------+---------+
    12. | id | name | age | gender | subject |
    13. +----+--------+------+--------+---------+
    14. | 1 | 刘备 | 33 | male | java |
    15. | 2 | 关羽 | 32 | male | yunwei |
    16. | 4 | 貂蝉 | 18 | female | ui |
    17. | 5 | 大乔 | 18 | female | ui |
    18. | 6 | 小乔 | 16 | female | ui |
    19. +----+--------+------+--------+---------+
    20. 5 rows in set (0.00 sec)

    第四步:突然发现了硬件故障,数据库丢失了。

    1. [root@mysql-server data]# mysql -e "drop database db_itheima;" -p
    2. Enter password:

    把db_itheima数据库进行了删除。

    故障开始了。

    第五步:动员运维工程师开始进行数据恢复,马上把最新的二进制文件进行备份。

    把最新的二进制日志进行备份。一会儿我们要用到这个二进制日志。这个文件的大小也要关注下,915B,有内容的。

    1. [root@mysql-server data]# cp binlog.000005 /tmp/sqlbak/
    2. [root@mysql-server data]# cd /tmp/sqlbak
    3. [root@mysql-server sqlbak]# ll
    4. total 876
    5. -rw-r--r-- 1 root root 890067 Sep 29 07:04 all.sql
    6. -rw-r----- 1 root root 915 Sep 29 07:14 binlog.000005

    现在已经保护了现场。

    实际生产环境中,建议将所有的二进制日志进行备份拷贝。

    第六步: 先进行一个全库的恢复。

    1. [root@mysql-server sqlbak]# mysql < /tmp/sqlbak/all.sql -p
    2. Enter password:
    3. mysql> select * from tb_student;
    4. +----+--------+------+--------+---------+
    5. | id | name | age | gender | subject |
    6. +----+--------+------+--------+---------+
    7. | 1 | 刘备 | 33 | male | java |
    8. | 2 | 关羽 | 32 | male | yunwei |
    9. | 3 | 张飞 | 30 | male | python |
    10. | 4 | 貂蝉 | 18 | female | ui |
    11. | 5 | 大乔 | 18 | female | ui |
    12. +----+--------+------+--------+---------+
    13. 5 rows in set (0.00 sec)

    也可以使用在mysql数据库中使用source命令进行数据库的导入操作。

    这个时候,我们看下,是全库备份点的数据。其完整度并不高,其中没有小乔,张飞应该被删除掉的,张飞还在。那这个应该是二进制日志中的内容。

    第七步:通过binlog二进制日志的增量备份还原数据到100%。(关键)

    学会读二进制日志文件,必须通过专业的工具mysqlbinlog

    [root@mysql-server ~]# mysqlbinlog /tmp/sqlbak/binlog.000005
    

    重点找事故的临界点。如drop database这个临界点。确认at位置。

    at 805这个临界点,正好就是故障点。我们可以恢复到740这个位置。

    1. [root@mysql-server ~]# mysqlbinlog --start-position=4 --stop-position=740 /tmp/sqlbak/binlog.000005 |mysql -p
    2. Enter password:
    3. [root@mysql-server ~]#

    最后,我们再做下检查。

    1. mysql> select * from tb_student;
    2. +----+--------+------+--------+---------+
    3. | id | name | age | gender | subject |
    4. +----+--------+------+--------+---------+
    5. | 1 | 刘备 | 33 | male | java |
    6. | 2 | 关羽 | 32 | male | yunwei |
    7. | 4 | 貂蝉 | 18 | female | ui |
    8. | 5 | 大乔 | 18 | female | ui |
    9. | 6 | 小乔 | 16 | female | ui |
    10. +----+--------+------+--------+---------+
    11. 5 rows in set (0.00 sec)
  • 相关阅读:
    再谈super、static、final
    为什么文件进行压缩后总是自带密码?
    vscode的配置文件
    配置Jedis连接池
    ElasticSearch深度分页并可以小幅度跳页的实现
    移动一个const对象会发生什么?
    网络限速导致的服务器访问https异常得处理过程
    经典算法——二分查找
    Spring StateMachine 使用@WithStateMachine 遇到的transition报错,状态无法回滚的问题
    C++11特性——右值引用
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/133406272