• mysql——MySQL数据库备份、恢复(第九章)


    MySQL数据库备份、恢复

    日志管理

    错误日志
    
    	rpm MySQL:  /var/log/mysqld.log 
    	源码软件:  数据目录	/mydata/data/<主机名>.err 
    
    
    慢查询日志
    
    	mysql> SHOW GLOBAL VARIABLES;			>>>查看MySQL服务器的变量
    
    	mysql> SHOW GLOBAL VARIABLES LIKE "%log%";
    
    	变量:
    	
    		long_query_time			指定慢查询的时间
    		slow_query_log			是否开启慢查询日志
    		slow_query_log_file		指定慢查询日志的文件名称及路径
    

    二进制日志 binary log

    记录任何有可能引起数据库变化的操作
    默认存放在数据目录
    查看二进制日志文件内容时,使用mysqlbinlog
    

    作用:

    1、实现数据即时点还原
    2、实现MySQL主从复制 
    

    二进制日志事件event:

    二进制日志中记录的每一个操作,称为事件
    
    记录产生时间(starttime)、在日志文件中的相对位置(position)	
    

    启用二进制日志文件

    vim /etc/my.cnf

    [mysqld]
    server_id=101
    log_bin=mysql-bin 
    

    [root@node01 ~]# systemctl start mysqld

    查看二进制日志文件内容

    [root@node01 mysql]# mysqlbinlog /var/lib/mysql/mysql-bin.000001

    参数:

    --start-datetime
    --stop-datetime 
    

    [root@node01 mysql]# mysqlbinlog --start-datetime="2017-03-14 10:26:31" --stop-datetime="2017-03-14 10:26:44" /var/lib/mysql/mysql-bin.000001

    --start-position
    --stop-position
    

    [root@node01 mysql]# mysqlbinlog --start-position=219 --stop-position=313 /var/lib/mysql/mysql-bin.000001

    查看所有的二进制日志文件

    mysql> SHOW BINARY LOGS;
    +------------------+-----------+
    | Log_name | File_size |
    +------------------+-----------+
    | mysql-bin.000001 | 748 |
    +------------------+-----------+
    1 row in set (0.00 sec)

    查看正在使用的二进制日志文件

    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+-------------------+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 | 154 | | | |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    查看二进制日志文件中的事件

    mysql> SHOW BINLOG EVENTS IN "mysql-bin.000002";
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    | Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    | mysql-bin.000002 | 4 | Format_desc | 105 | 123 | Server ver: 5.7.17-log, Binlog ver: 4 |
    | mysql-bin.000002 | 123 | Previous_gtids | 105 | 154 | |
    | mysql-bin.000002 | 154 | Anonymous_Gtid | 105 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
    | mysql-bin.000002 | 219 | Query | 105 | 319 | CREATE DATABASE testdb |
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    4 rows in set (0.00 sec)

    二进制日志文件滚动

    1、手动执行flush logs

    mysql> flush logs;

    2、服务重启

    3、单个文件超过1G大小

    MySQL数据库备份、恢复

    备份类型:

    1、根据服务是否在线

    热备份
    	服务在线,执行读、写的操作
    	
    温备份
    	服务在线,执行读操作(锁表的方式)
    	
    冷备份
    	服务不在线 
    

    2、根据备份的数据量

    完全备份
    增量备份
    	备份自上一次备份以来,修改过的数据
    差异备份
    	备份自上一次完全备份以来,修改过的数据 
    

    3、根据备份的方式

    物理备份
    	拷贝数据文件
    逻辑备份
    

    备份的文件:
    数据目录数据文件、二进制日志、配置文件

    备份工具:

    物理备份
    	cp
    	tar
    	xtrabackup(Percona)
    	ibbackup  / NBU
    	
    逻辑备份 
    	mysqldump 
    	SELECT
    

    mysqldump工具的使用:逻辑备份
    mysqldump(完全备份) + 二进制日志文件
    实现完全 + 增量

    常用选项:

    db_name [tb1] [tb2]:备份指定数据库或表  
    
    	备份库时不包含创建库的命令,恢复时,需要事先创建空白库
    		
    --master-data={ 1 | 2 }
    	1:以CHANGE MASTER TO 的方式记录位置,可用于恢复后直接启动从服务器
    	2:以CHANGE MASTER TO 的方式记录位置,但默认被注释;
    	
    # mysqldump -u root -p --master-data=2 studb > /backup/studb-`date +%F-%H-%M-%S`.sql
    	查看备份文件内容,可看到以CHANGE MASTER TO 方式记录的二进制文件名称及位置 
    	
    --lock-all-tables
    	锁定所有表
    			
    --flush-logs
    	执行二进制日志文件滚动
    
    如果指定库中的表类型均为InnoDB,可使用选项--single-transaction启动热备份;不要与lock-all-tables一起使用
    
    备份多个库:
    	--all-databases:备份所有库
    		
    		# mysqldump -u root -p --master-data=2 --lock-all-tables --flush-logs --all-databases > /backup/all.sql
    	
    	--databases <db_name>:备份指定库
    		此两个选项备份时会备份创建库的命令,因此,恢复时不再需要创建空白库		
    

    示例1:使用mysqldump备份数据库,利用二进制日志实现即时点还原

    备份策略:
    	mysqldump(完全备份)
    	每日备份二进制日志,实现增量备份		
    

    1、准备备份磁盘设备 /backup

    [root@node01 ~]# df -h | grep backup
    /dev/vdb1 7.8G 36M 7.3G 1% /backup

    2、进行完全备份

    [root@node01 ~]# mysqldump -u root -p --lock-all-tables --flush-logs --master-data=2 --all-databases > /backup/date +%F-%T.all-db.sql

    3、模拟周二的操作

    mysql> DELETE FROM tutors WHERE Age > 60;

    4、备份周二的二进制日志文件 实现增量备份

    [root@node01 ~]# mysqlbinlog /var/lib/mysql/mysql-bin.000008 > /backup/date +%F-%T.increment.sql

    5、模拟周三的操作,插入数据

    mysql> INSERT INTO tutors(Tname) VALUES("user1"),("user2"),("user3");

    6、备份周三的二进制日志文件,实现增量备份

    [root@node01 ~]# mysqlbinlog --start-position=514 /var/lib/mysql/mysql-bin.000008 > /backup/date +%F-%T.incremnt2.sql

    实现数据恢复

    [root@node01 ~]# systemctl stop mysqld
    [root@node01 ~]# rm -rf /var/lib/mysql/*

    1. 启动服务,重新初始化数据

    [root@node01 ~]# systemctl start mysqld

    1. 设置root密码

    [root@node01 ~]# mysqladmin -u root -p password "Www.1.com"
    Enter password:

    1. 恢复周一的数据

    [root@node01 ~]# mysql -u root -p < /backup/2017-03-14-13:52:53.all-db.sql

    1. 恢复周二、三的数据

    mysql> SOURCE /backup/2017-03-14-13:56:42.increment.sql;

    mysql> SOURCE /backup/2017-03-14-14:01:08.incremnt2.sql;

    示例2:使用SELECT实现逻辑备份

    主要适用于备份单表的数据  
    

    SELECT * INTO OUTFILE FROM <tb_name>

    将jiaowu库中的students表备份到/backup/students.txt文件中

    [root@node01 ~]# setfacl -m u:mysql:rwx /backup/

    vim /etc/my.cnf

    [mysqld]
    
    secure-file-priv = ""
    

    systemctl restart mysqld

    mysql> SELECT * INTO OUTFILE "/backup/students.txt" FROM jiaowu.students;

    使用LOAD DATA恢复数据

    LOAD DATA INFILE '' INTO TABLE <tb_name>;

    mysql> CREATE TABLE new_students LIKE students;

    mysql> LOAD DATA INFILE "/backup/students.txt" INTO TABLE jiaowu.new_students;

    ==============================================================================================

    物理备份

    1、使用xtrabackup工具实现物理备份

    1. 完全备份

    innobackupex --user=<用户名> --password=<密码> /path/to/backup

    1. 从完全备份恢复数据

    innobackupex --apply-log <完全备份目录>

    innobackupex --copy-back <完全备份目录>

    示例1:使用xtrabackup实现完全备份

    [root@node01 ~]# yum install -y percona-xtrabackup-24

    [root@node01 ~]# innobackupex --user=root --password=Www.1.com /backup/

    模拟恢复:

    [root@node01 ~]# systemctl stop mysqld
    [root@node01 ~]# rm -rf /var/lib/mysql/*

    [root@node01 ~]# innobackupex --apply-log /backup/2017-03-14_15-54-49/ >>>准备完全备份

    [root@node01 ~]# innobackupex --copy-back /backup/2017-03-14_15-54-49/

    [root@node01 ~]# chown -R mysql.mysql /var/lib/mysql

    [root@node01 ~]# systemctl start mysqld

    最后登录数据库,验证数据是否恢复!!!

    使用xtrabackup实现增量备份

    innobackupex --user= --password= --incremental <备份目录> --incremental-basedir=<上一次备份目录>

    注意:
    basedir
    第1次增量备份,完全备份目录
    第2次增量备份,指上一次增量备份目录

    恢复增量备份

    innobackupex --apply-log --redo-only <完全备份目录>

    接着执行:

    innobackupex --apply-log --redo-only <完全备份目录> --incremental-dir=INCREMENTAL-DIR-1

    而后是第二个增量备份:

    innobackupex --apply-log --redo-only <完全备份目录> --incremental-dir=INCREMENTAL-DIR-2

    恢复时,直接使用第1次的完全备份即可

    示例2:使用xtrbackup实现完全备份+增量备份

    1. 进行完全备份

    [root@node01 ~]# innobackupex --user=root --password=Www.1.com /backup/

    1. 登录数据库,进行操作

    mysql> INSERT INTO tutors(Tname) VALUES("user4"),("user5");

    [root@node01 ~]# innobackupex --user=root --password=Www.1.com --incremental /backup/ --incremental-basedir=/backup/2017-03-14_16-08-31/

    1. 再次登录数据库,进行操作

    mysql> INSERT INTO tutors(Tname) VALUES("user6"),("user7");

    [root@node01 ~]# innobackupex --user=root --password=Www.1.com --incremental /backup/ --incremental-basedir=/backup/2017-03-14_16-11-47

    模拟恢复:

    [root@node01 ~]# systemctl stop mysqld.service
    [root@node01 ~]# rm -rf /var/lib/mysql/*

    1. 准备完全备份

    [root@node01 ~]# innobackupex --apply-log --redo-only /backup/2017-03-14_16-08-31/

    1. 准备第1次增量备份

    [root@node01 ~]# innobackupex --apply-log --redo-only /backup/2017-03-14_16-08-31/ --incremental-dir=/backup/2017-03-14_16-11-47

    1. 准备第2次增量备份

    [root@node01 ~]# innobackupex --apply-log --redo-only /backup/2017-03-14_16-08-31/ --incremental-dir=/backup/2017-03-14_16-15-10

    1. 恢复完全备份

    [root@node01 ~]# innobackupex --copy-back /backup/2017-03-14_16-08-31/

    [root@node01 ~]# chown -R mysql.mysql /var/lib/mysql

    [root@node01 ~]# systemctl start mysqld

    示例:借助LVM快照实现几乎热备份(完全+增量)

    前提条件:数据目录必须是逻辑卷
    
    1. 准备逻辑卷,挂载到/var/lib/mysql

    2. 锁表,建立快照 (两个终端完成)

    mysql> FLUSH TABLE WITH READ LOCK;

    [root@node01 ~]# lvcreate -s -p r -L 500M -n lvsnap /dev/vg1/lv1

    1. 记录当前正在使用的二进制日志信息

    [root@node01 ~]# mysql -uroot -pWww.1.com -e "SHOW MASTER STATUSG" > /tmp/1.txt

    1. 挂载快照,实现完全备份

    [root@node01 ~]# mount /dev/vg1/lvsnap /mnt/

    [root@node01 ~]# tar czf /backup/date +%F-%T-all.tar.gz /mnt/

    [root@node01 ~]# umount /mnt/
    [root@node01 ~]# lvremove -f /dev/vg1/lvsnap
    Logical volume "lvsnap" successfully removed

    1. 登录数据库,进行操作

    mysql> INSERT INTO jiaowu.tutors(Tname) VALUES("user8");

    [root@node01 ~]# mysqlbinlog --start-position=154 /var/lib/mysql/mysql-bin.000003 > /backup/date +%F-%T.incrment.sql

    有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 想到与得到中间还有两个字——做到。
  • 相关阅读:
    第03组 Alpha冲刺(3/4)
    第03组 Alpha冲刺(2/4)
    第03组 Alpha冲刺(1/4)
    第08组 Beta版本演示
    第08组 Beta冲刺(4/4)
    第08组Beta冲刺(3/4)
    第08组Beta冲刺(2/4)
    第08组 Beta冲刺(1/4)
    Alpha事后诸葛亮
    第08组 Alpha冲刺(4/4)
  • 原文地址:https://www.cnblogs.com/huoxc/p/13047829.html
Copyright © 2020-2023  润新知