七、备份实战2

1.备份实战2

  mysqldump+binlog

  优势

    自动记录日志position位置

    可用性,一致性

  

  语法

    mysqldump -h 服务器地址 -u用户名 -p密码 数据库名 > 备份文件.sql

    mysqldump --help

  

  备份实战

    准备两套root密码

    密码1  Qianfeng@123  配置当前数据库中

    密码2  Qianfeng@1234  备用

    准备库1

    mysql -uroot -p'Qianfeng@123'

    drop database testdb;  清除之前的库

    create database testdb1;

    use testdb1;

    create table t1 (id int);

    instert into testdb1.t1 values (1), (2), (3);

    select * from t1;

    \q

    执行备份

    mkdir /backup

    mysqldump -uroot -p'Qianfeng@123' -all-databases --single-transaction --master-data=2 --flush-logs > /backup/`data +%F-%H`-mysql-all.sql  账号  密码  所有库  保持数据的可用性  注释掉日志记录,写2可以多一个#  刷新切断日志 > 放到这个目录/  时间 -mysql-all.sql

    观察备份细节

    vim /backup/2022-01-18-12mysql-all.sql

    LOCK TABLES `user` WRITE;  观察各种锁机制,用来保证数据的一致性,当在备份一个表时,该表会被锁住,不允许写,但可以读,等备份完该表后就会解锁,因为这一个过程很快,所以不影响使用

    22 -- CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000003', MASTER_LOG_POS=154;  可以看到这行,是flush-logs截断的,--就是master-data=2的效果,如果是1就没有-- ,但是内容依旧在

    备份后再次创库和变更数据

    mysql -uroot -p'Qianfeng@123'

    create database testdb2;

    create table testdb2.t2 (id, int);

    insert into testdb2.t2(1),(2),(3);

    \q

    mysql -uroot -p'Qianfeng@123'

    insert into testdb.t2(4),(5);

    create database testdb3;

    \q

    观察备份二进制日志文件

    ls /var/lib/mysql/  可以看到bin文件已经到00003了

    停止数据库

    systemctl stop mysqld

    清理环境

    rm -rf /var/lib/mysql/*

    启动数据库

    systemctl start mysqld

    grep password /var/log/mysqld.log

    mysqladmin -uroot -p'RxN2AdV!u(Ah' password 'Qianfeng@1234'  这里用的是1234的备用密码

    mysql -uroot -p'Qianfeng@1234'

    show databases;  是新的mysql

    \q

    mysql -uroot -p'Qianfeng@1234' < /backup/2022-01-18-12mysql-all.sql  用备份恢复数据

    mysql -uroot -p'Qianfeng@1234'

    show databases;  可以发现是有testdb1的

    且只有testdb1的库,并没有testdb2和testdb3,这时候就需要使用二进制日志恢复了

    

    二进制日志恢复

    观察二进制截取记录

    vim /backup/2022-01-18-12mysql-all.sql

    22 -- CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000003', MASTER_LOG_POS=154;  改变主服务器到主服务器文件=localhost-bin.000003,从154往后都是新的

     mysqlbinlog localhost-bin.000003 localhost-blin.000004 --start-position=154 | mysql -uroot -p'Qianfeng@123'  通过mysqlbinlog重写数据 用导管给到该用户

    mysql -uroot -p'Qianfeng@123' -e 'show databases'  可以发现2和3都回来

 

    如果我需要保留testdb3库,而testdb3库因为误操删了,不是正常的行为,不是我们需要做的范畴

    mysqlbinlog localhost-bin.000003 > 1.txt

    vim 1.txt

    删除1.txt中不需要的at(比如删除drop database testdb3的那行at)

    cat 1.txt | mysql -p'Qianfeng@123'  很可能失败

    这样会有许多和二进制日志行为所冲突

    停止二进制日志

    mysql -uroot -p'Qianfeng@123'

    set sql_log_bin = 0;

    读取资源

    source 1.txt;

    开启二级制日志

    set sql_log_bin = 1;

    这样就不会有二进制日志行为冲突

      

posted @ 2022-01-17 21:57  真渡  阅读(42)  评论(0)    收藏  举报