mysql备份与恢复

mysql备份与恢复
#mysqldump备份emp的dept_emp表,并同时备份到远程主机192.128.232.128上面去。

[root@localhost ~]# mysqldump -uroot -S /tmp/mysql.sock57 -R --triggers \
                 -E --single-transaction --master-data=2 --max_allowed_packet=128M --flush-logs emp dept_emp |pv|gzip -c |ssh root@192.128.232.128 'cat > emp.dept_emp.tar.gz'

#--master-data=2                 
功能:
(1)在备份时,会自动记录,二进制日志文件名和位置号
0 默认值
1  以change master to命令形式,可以用作主从复制
2  以注释的形式记录,备份时刻的文件名+postion号
(2) 自动锁表
(3)如果配合--single-transaction,只对非InnoDB表进行锁表备份,InnoDB表进行“热“”备,实际上是实现快照备份。

#--single-transaction

innodb 存储引擎开启热备(快照备份)功能       
master-data可以自动加锁
(1)在不加--single-transaction ,启动所有表的温备份,所有表都锁定
(1)加上--single-transaction ,对innodb进行快照备份,对非innodb表可以实现自动锁表功能
例子6: 备份必加参数
mysqldump -uroot -p -A -R -E --triggers --master-data=2  --single-transaction --max_allowed_packet=128M --set-gtid-purged=OFF >/data/backup/full.sql


#--set-gtid-purged=auto
auto , on
off 
使用场景:
1. --set-gtid-purged=OFF,可以使用在日常备份参数中.作为数据恢复。
mysqldump -uroot -p123 -A -R -E --triggers --master-data=2  --single-transaction --max_allowed_packet=128M --flush-logs --set-gtid-purged=OFF >/data/backup/full.sql

2. auto , on:在构建主从复制环境时需要的参数配置
mysqldump -uroot -p123 -A -R -E --triggers --master-data=2  --single-transaction --max_allowed_packet=128M --flush-logs --set-gtid-purged=ON >/data/backup/full.sql

#备份时优化参数:
(1) max_allowed_packet   最大的数据包大小
mysqldump -uroot -p123 -A  -R  --triggers --flush-logs --set-gtid-purged=OFF --master-data=2 --max_allowed_packet=128M --single-transaction | gzip > /backup/full_$(date +%F).sql.gz

(2) 增加key_buffer_size    (临时表有关)
(3) 分库分表并发备份       
(4) 架构分离,分别备份      (架构拆分,分布式备份)

                 
#备份原理
1.开启general_log,并同时设置log_output到表里来查看备份原理。默认是不需要开启的。
(root@localhost) [(none)] set global general_log = 1;
Query OK, 0 rows affected (0.02 sec)

(root@localhost) [(none)] set global log_output='table';
Query OK, 0 rows affected (0.00 sec)

2.备份一个小的库
[root@localhost ~]# mysqldump -uroot -S /tmp/mysql.sock57 -R --triggers -E --max_allowed_packet=128M --single-transaction \
          --master-data=2 --flush-logs -B test > test.sql

3.在把general_log给关掉
(root@localhost) [test] set global general_log = 0;
Query OK, 0 rows affected (0.00 sec)

4.分析备份原理
由于上面打开了general_log,所有在mysql库下有一个表叫general_log的,这个表就是记录刚才备份的那条命令执行对test库备份的过程。

(root@localhost) [mysql] select thread_id,left(argument,64) from  general_log where thread_id = 15 order by event_time;
+-----------+------------------------------------------------------------------+
| thread_id | left(argument,64)                                                |
+-----------+------------------------------------------------------------------+
|        15 | SHOW STATUS LIKE 'binlog_snapshot_%'                             |
|        15 | FLUSH /*!40101 LOCAL */ TABLES                                   |
|        15 | FLUSH TABLES WITH READ LOCK                                      |  #为了避免较长的事务操作造成FLUSH TABLES WITH READ LOCK操作迟迟得不到锁,但同时又阻塞了其它客户端操作。
|        15 |                                                                  |
|        15 | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ          |  #设置当前会话的事务隔离等级为RR,RR可避免不可重复读和幻读。
|        15 | START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */           |  #开启事务的一致性快照。
|        15 | SHOW MASTER STATUS                                               |  #记录了开始备份时,binlog的状态信息,包括MASTER_LOG_FILE和MASTER_LOG_POS。
|        15 | UNLOCK TABLES                                                    |
|        15 | set optimizer_switch='semijoin=off'                              |
|        15 | SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZ |
|        15 | SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME,  |
|        15 | set optimizer_switch=default                                     |
|        15 | test                                                             |
|        15 | SHOW CREATE DATABASE IF NOT EXISTS `test`                        |
|        15 | show tables                                                      |
|        15 | show table status like 'ai'                                      |
|        15 | SET SQL_QUOTE_SHOW_CREATE=1                                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | show create table `ai`                                           |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show fields from `ai`                                            |
|        15 | SELECT /*!40001 SQL_NO_CACHE */ * FROM `ai`                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | test                                                             |
|        15 | select @@collation_database                                      |
|        15 | SHOW TRIGGERS LIKE 'ai'                                          |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show table status like 'l'                                       |
|        15 | SET SQL_QUOTE_SHOW_CREATE=1                                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | show create table `l`                                            |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show fields from `l`                                             |
|        15 | SELECT /*!40001 SQL_NO_CACHE */ * FROM `l`                       |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | test                                                             |
|        15 | select @@collation_database                                      |
|        15 | SHOW TRIGGERS LIKE 'l'                                           |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show table status like 'x'                                       |
|        15 | SET SQL_QUOTE_SHOW_CREATE=1                                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | show create table `x`                                            |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show fields from `x`                                             |
|        15 | SELECT /*!40001 SQL_NO_CACHE */ * FROM `x`                       |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | test                                                             |
|        15 | select @@collation_database                                      |
|        15 | SHOW TRIGGERS LIKE 'x'                                           |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show table status like 'y'                                       |
|        15 | SET SQL_QUOTE_SHOW_CREATE=1                                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | show create table `y`                                            |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show fields from `y`                                             |
|        15 | SELECT /*!40001 SQL_NO_CACHE */ * FROM `y`                       |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | test                                                             |
|        15 | select @@collation_database                                      |
|        15 | SHOW TRIGGERS LIKE 'y'                                           |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 | show events                                                      |
|        15 | test                                                             |
|        15 | select @@collation_database                                      |
|        15 | SET SESSION character_set_results = 'binary'                     |
|        15 | SHOW FUNCTION STATUS WHERE Db = 'test'                           |
|        15 | SHOW PROCEDURE STATUS WHERE Db = 'test'                          |
|        15 | SHOW CREATE PROCEDURE `proc_test1`                               |
|        15 | SET SESSION character_set_results = 'utf8'                       |
|        15 |                                                                  |
|        15 | root@localhost on  using Socket                                  |
|        15 | /*!40100 SET @@SQL_MODE='' */                                    |
|        15 | /*!40103 SET TIME_ZONE='+00:00' */                               |
+-----------+------------------------------------------------------------------+
75 rows in set (0.01 sec)

#mysql的备份与恢复实例
1.备份test库
[root@localhost ~]# mysqldump -uroot -S /tmp/mysql.sock57 -R --triggers -E --single-transaction --max_allowed_packet=128M --master-data=2 --flush-logs -B test |pv|gzip >test.backup.tgz

2.删除test库
(root@localhost) [mysql] drop database test;
Query OK, 4 rows affected (0.02 sec)

3.恢复test库
[root@localhost ~]# gunzip < test.backup.tgz |mysql -uroot -S /tmp/mysql.sock57

4.查看test库是否被恢复了
[root@localhost ~]# mysql -uroot -S /tmp/mysql.sock57 -e 'show databases like "test";'
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+

总结:mysqldump是单线程,备份慢,恢复也慢。

#备份工具mydumper

yum install glib2-devel mysql-devel zlib-devel pcre-devel zlib gcc-c++ gcc cmake -y
wget https://launchpadlibrarian.net/225370879/mydumper-0.9.1.tar.gz
tar xf mydumper-0.9.1.tar.gz
cd mydumper-0.9.1/
cmake .
make && make install

1.mydumper备份
[root@localhost mydumper-0.9.1]# /usr/local/src/mydumper-0.9.1/mydumper -u root -S /tmp/mysql.sock57 -G -E -R --trx-consistency-only -t 8 -c -B sbtest -o sbtest_backup20210519

2.开启另外一个终端,可以看到同时在备份sbtest这个库下的多个表,上面备份指定开启了8个线程,可以同时备份8张表。由于sbtest库下只有3个表。
(root@localhost) [mysql] show processlist;
+----+-----------------+---------------------+-------+---------+-------+------------------------+-----------------------------------------------------------+
| Id | User            | Host                | db    | Command | Time  | State                  | Info                                                      |
+----+-----------------+---------------------+-------+---------+-------+------------------------+-----------------------------------------------------------+
|  1 | event_scheduler | localhost           | NULL  | Daemon  | 23653 | Waiting on empty queue | NULL                                                      |
| 10 | fengge          | 192.128.232.1:62952 | test  | Sleep   |  2877 |                        | NULL                                                      |
| 11 | fengge          | 192.128.232.1:53436 | test  | Sleep   |  2877 |                        | NULL                                                      |
| 12 | root            | localhost           | mysql | Query   |     0 | starting               | show processlist                                          |
| 17 | root            | localhost           | NULL  | Sleep   |  8398 |                        | NULL                                                      |
| 32 | root            | localhost           | NULL  | Query   |    58 | Sending data           | SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest`.`sbtest2` |
| 33 | root            | localhost           | NULL  | Query   |    58 | Sending data           | SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest`.`sbtest3` |
| 34 | root            | localhost           | NULL  | Query   |    58 | Sending data           | SELECT /*!40001 SQL_NO_CACHE */ * FROM `sbtest`.`sbtest1` |
+----+-----------------+---------------------+-------+---------+-------+------------------------+-----------------------------------------------------------+
8 rows in set (0.03 sec)

3.查看备份好的文件,以库每个表来独立备份。
[root@localhost mydumper-0.9.1]# cd sbtest_backup20210519/
[root@localhost sbtest_backup20210519]# ll
总用量 281688
-rw-r--r-- 1 root root      142 5月  19 17:25 metadata   #binlog日志的备份时的文件跟位置点
-rw-r--r-- 1 root root      242 5月  19 17:18 sbtest.sbtest1-schema.sql.gz    #sbtest1表创建的sql
-rw-r--r-- 1 root root 96139604 5月  19 17:25 sbtest.sbtest1.sql.gz           #sbtest1表的数据
-rw-r--r-- 1 root root      240 5月  19 17:18 sbtest.sbtest2-schema.sql.gz
-rw-r--r-- 1 root root 96142156 5月  19 17:25 sbtest.sbtest2.sql.gz
-rw-r--r-- 1 root root      241 5月  19 17:18 sbtest.sbtest3-schema.sql.gz
-rw-r--r-- 1 root root 96139418 5月  19 17:25 sbtest.sbtest3.sql.gz
-rw-r--r-- 1 root root       88 5月  19 17:18 sbtest-schema-create.sql.gz


4.恢复sbtest库,这里我指定恢复到sb的这个库,这个sb库可以不用提前创建。
[root@localhost mydumper-0.9.1]# myloader -u root -S /tmp/mysql.sock57 -d sbtest_backup20210519 -t 8 -B sb

5.查看另外一个终端,sbtest1,sbtest2,sbtest3这个三个表都是同时进行恢复。
(root@localhost) [(none)] show processlist;
+----+-----------------+---------------------+------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
| Id | User            | Host                | db   | Command | Time  | State                  | Info                                                                                                 |
+----+-----------------+---------------------+------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
|  1 | event_scheduler | localhost           | NULL | Daemon  | 24798 | Waiting on empty queue | NULL                                                                                                 |
| 10 | fengge          | 192.128.232.1:62952 | test | Sleep   |  4022 |                        | NULL                                                                                                 |
| 11 | fengge          | 192.128.232.1:53436 | test | Sleep   |  4022 |                        | NULL                                                                                                 |
| 17 | root            | localhost           | NULL | Sleep   |  9543 |                        | NULL                                                                                                 |
| 40 | root            | localhost           | sb   | Sleep   |    30 |                        | NULL                                                                                                 |
| 43 | root            | localhost           | sb   | Query   |     0 | update                 | INSERT INTO `sbtest3` VALUES
(65044,498049,"23862069598-41380368606-32481559955-55587906175-32646627 |
| 44 | root            | localhost           | sb   | Query   |     0 | update                 | INSERT INTO `sbtest2` VALUES
(75042,502206,"79969031435-09597128948-48269076766-84867707978-33970612 |
| 48 | root            | localhost           | sb   | Query   |     0 | update                 | INSERT INTO `sbtest1` VALUES
(70043,563804,"07268046566-55347626028-92880364703-85142696939-29664187 |
| 49 | root            | localhost           | NULL | Query   |     0 | starting               | show processlist                                                                                     |
+----+-----------------+---------------------+------+---------+-------+------------------------+------------------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)

6.如何做到一致性备份


#xbk进行mysql备份。
(1)对于非Innodb表(比如 myisam)是,锁表copy所有的非innodb数据文件,属于一种温备份。
(2)对于Innodb的表(支持事务的),不锁表,立即触发checkpoint,会立即记录一个LSN,copy数据文件,拷贝数据页,最终以数据文件的方式保存下来,
   将备份过程中产生的redo进行截取或者保存,并记录最新的LSN,把一部分redo和undo一并备走,属于热备方式。

#在备份与恢复时过程原理,
  0、xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
  1、备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
  2、在恢复之前,模拟Innodb“自动故障恢复CSR”的过程,将redo(前滚)与undo(回滚)进行应用
  3、恢复过程是cp 备份到原来数据目录下

xtrabackup_binlog_info :(备份时刻的binlog位置)
[root@db01 full]# cat xtrabackup_binlog_info 
mysql-bin.000003    536749
79de40d3-5ff3-11e9-804a-000c2928f5dd:1-7
记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点。

xtrabackup_checkpoints :
backup_type = full-backuped
from_lsn = 0               上次所到达的LSN号(对于全备就是从0开始,对于增量有别的显示方法)
to_lsn = 160683027      备份开始时间(ckpt)点数据页的LSN    
last_lsn = 160683036    备份结束后,redo日志最终的LSN
compact = 0
recover_binlog_info = 0
(1)备份时刻,立即将已经commit过的,内存中的数据页刷新到磁盘(CKPT).开始备份数据,数据文件的LSN会停留在to_lsn位置。
(2)备份时刻有可能会有其他的数据写入,已备走的数据文件就不会再发生变化了。
(3)在备份过程中,备份软件会一直监控着redo的undo,如果一旦有变化会将日志也一并备走,并记录LSN到last_lsn。
从to_lsn  ----》last_lsn 就是,备份过程中产生的数据变化.

10.4.3 innobackupex 增量备份(incremental)
(1)增量备份的方式,是基于上一次备份进行增量。
(2)增量备份无法单独恢复。必须基于全备进行恢复。
(3)所有增量必须要按顺序合并到全备中。
增量备份命令
(1)删掉原来备份
略.
(2)全备(周日)
[root@db01 backup]# innobackupex --user=root --password=123 --no-timestamp /backup/full >&/tmp/xbk_full.log
(3)模拟周一数据变化
db01 [(none)]>create database cs charset utf8;
db01 [(none)]>use cs
db01 [cs]>create table t1 (id int);
db01 [cs]>insert into t1 values(1),(2),(3);

(4)第一次增量备份(周一)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full  /backup/inc1 &>/tmp/inc1.log
(5)模拟周二数据
db01 [cs]>create table t2 (id int);
db01 [cs]>insert into t2 values(1),(2),(3);

(6)周二增量
 innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1  /backup/inc2  &>/tmp/inc2.log
(7)模拟周三数据变化
db01 [cs]>create table t3 (id int);
db01 [cs]>insert into t3 values(1),(2),(3);
db01 [cs]>drop database cs;

恢复到周三误drop之前的数据状态
恢复思路:
1.  挂出维护页,停止当天的自动备份脚本
2.  检查备份:周日full+周一inc1+周二inc2,周三的完整二进制日志
3. 进行备份整理(细节),截取关键的二进制日志(从备份——误删除之前)
4. 测试库进行备份恢复及日志恢复
5. 应用进行测试无误,开启业务
6. 此次工作的总结

恢复过程
1. 检查备份
1afe8136-601d-11e9-9022-000c2928f5dd:7-9
2. 备份整理(apply-log)+合并备份(full+inc1+inc2)
3.最后一次增量合并到全量时,不用使用--redo-only参数。
(1) 全备的整理
[root@db01 one]# innobackupex --apply-log --redo-only /data/backup/full
(2) 合并inc1到full中
[root@db01 one]# innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full
(3) 合并inc2到full中
[root@db01 one]# innobackupex --apply-log  --incremental-dir=/data/backup/inc2 /data/backup/full
(4) 最后一次整理全备
[root@db01 backup]#  innobackupex --apply-log  /data/backup/full

3. 截取周二 23:00 到drop 之前的 binlog 
#查看删除时的gtid号,这个gitd不能包含
[root@db01 inc2]# mysqlbinlog /data/mysql_data/mysql-binlog.000006 |grep -A12 -B12 "drop database cs"
[root@mysql-131 20210719]# mysqlbinlog /data/mysql_data/mysql-binlog.000006 |grep -A12 -B12 "drop database cs"
SET @@SESSION.GTID_NEXT= '4edd14fd-df90-11eb-813c-000c293ef59b:18'/*!*/;
# at 1158
#210719 20:16:55 server id 131  end_log_pos 1260 CRC32 0x7fa99224       Query   thread_id=4     exec_time=0error_code=0
SET TIMESTAMP=1626697015/*!*/;
alter table t2 import tablespace
/*!*/;
# at 1260
#210719 20:53:31 server id 131  end_log_pos 1325 CRC32 0xec6086ce       GTID    last_committed=6        sequence_number=7
SET @@SESSION.GTID_NEXT= '4edd14fd-df90-11eb-813c-000c293ef59b:19'/*!*/;    #这个gtid是删除cs库的事务id
# at 1325
#210719 20:53:31 server id 131  end_log_pos 1411 CRC32 0xc39557e9       Query   thread_id=13    exec_time=0error_code=0
SET TIMESTAMP=1626699211/*!*/;
drop database cs                   #删除cs的语句
/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;


[root@mysql-131 20210719]# cat full/xtrabackup_binlog_info
mysql-binlog.000006     1260    4edd14fd-df90-11eb-813c-000c293ef59b:1-15

#这里恢复的时候就不能包含gtid的19。
[root@db01 inc2]# mysqlbinlog --skip-gtids --include-gtids='4edd14fd-df90-11eb-813c-000c293ef59b:16-18' /data/binlog/mysql-bin.000009 >/data/backup/binlog.sql

4. 进行恢复
[root@db01 backup]# mkdir /data/mysql/data2 -p
[root@db01 full]# cp -a * /data/mysql/data2
[root@db01 backup]# chown -R mysql.  /data/*
[root@db01 backup]# systemctl stop mysqld
vim /etc/my.cnf
datadir=/data/mysql/data2
systemctl start mysqld
Master [(none)]>set sql_log_bin=0;
Master [(none)]>source /data/backup/binlog.sql
作业1
 Xtrabackup企业级增量恢复实战
背景:
某大型网站,mysql数据库,数据量500G,每日更新量20M-30M
备份策略:
xtrabackup,每周日0:00进行全备,周一到周六00:00进行增量备份。
故障场景:
周三下午2点出现数据库意外删除表操作。
如何恢复?


#从mysqldump 全备中获取库和表的备份
1、获得表结构
# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  full.sql>createtable.sql

2、获得INSERT INTO 语句,用于数据的恢复
# grep -i 'INSERT INTO `city`'  full.sqll >data.sql &

3.获取单库的备份
# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql


练习:mysqldump备份恢复例子
1、创建一个数据库 oldboy
2、在oldboy下创建一张表t1
3、插入5行任意数据
4、全备
5、插入两行数据,任意修改3行数据,删除1行数据
6、删除所有数据
7、再t1中又插入5行新数据,修改3行数据
需求,跳过第六步恢复表数据
作业3
分别写备份脚本和策略

作业4:备份集中单独恢复表
思考:在之前的项目案例中,如果误删除的表只有10M,而备份有500G,该如何快速恢复误删除表?
提示:
#可以通过mysqlfrm工具。通过frm文件查看创建表的语句
[root@mysql-131 mysql]# mysqlfrm --user=root --diagnostic --basedir=/usr/local/mysql city.frm

#恢复表数据
drop table city;
create table city like city_bak;
alter table city discard tablespace;
cp /backup/full/world/city.ibd  /application/mysql/data/world/
chown -R mysql.mysql  /application/mysql/data/world/city.ibd 
alter table city import  tablespace;


#通过tablespace来导入表数据
1.先删除cs库的所有表的tablespace.
 select concat('alter table ',table_schema,'.',table_name,' discard tablespace;') from information_schema.tables where table_schema = "cs" into outfile > /tmp/cs_tablespace.sql;

2.复制备份cs库所有表的ibd文件,到需要恢复的cs库下。并授权chown -R mysql.mysql
cp /backup/full/cs/*.ibd  /application/mysql/data/cs/
chown -R mysql.mysql /application/mysql/data/cs/

3.导入cs库所有表的tablespace
select concat('alter table ',table_schema,'.',table_name,' import tablespace;') from information_schema.tables where table_schema = "mysql";


1.使用一个新的实例来测试备份
[root@localhost ~]# cat /etc/my.cnf
[client]
user=root
password=1111aaA_          #几个实例的密码一定要设置这个。否则无法停止。
socket=/tmp/mysql.sock

[mysql]
prompt=(\u@\h) [\d]\_

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /usr/local/mysql/mysqld_multi.log

[mysqld57]
skip-name-resolve
port = 3306
server-id = 3306
basedir = /usr/local/mysql
datadir = /data/mysql_data
socket = /tmp/mysql.sock
log_error = /data/mysql_data/error.log
event_scheduler = 1
slow_query_log = 1
slow_query_log_file = slow.log
long_query_time = 2
sql_mode = "ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
binlog_format = row
log_bin=/data/mysql_data/mysql-binlog
slow_query_log=ON
slow_query_log_file=/data/mysql_data/mysql-slow.log
long_query_time=2

#innodb
innodb_flush_neighbors = 0
#innodb_log_file_size = 4G
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 4
innodb_online_alter_log_max_size = 512M
innodb_write_io_threads = 16
innodb_flush_method = O_DIRECT
innodb_io_capacity = 4000
innodb_purge_threads = 8
innodb_lock_wait_timeout = 300
innodb_autoinc_lock_mode = 2
innodb_status_output_locks = 1
innodb_print_all_deadlocks = 1

2.启动mysql
[root@localhost ~]# mysqld_multi start 57
[root@localhost ~]# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld57 is running

3.安装备份工具
[root@localhost src]# wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.9/binary/tarball/percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz
[root@localhost src]# tar -zxf percona-xtrabackup-2.4.9-Linux-x86_64.tar.gz -C /usr/local/
[root@localhost src]# cd /usr/local/
[root@localhost src]# ln -sv percona-xtrabackup-2.4.9-Linux-x86_64 percona-xtrabackup
[root@localhost src]# vi /etc/profile.d/percona-xtrabackup.sh
export XTRABACKUP_PATH=/usr/local/percona-xtrabackup/bin
export PATH=$PATH:$XTRABACKUP_PATH

[root@localhost src]# source /etc/profile.d/percona-xtrabackup.sh


4.备份,由于上面配置了密码,所以不需要指定password,备份完整的,为物理备份。
如果你删除了某个表,要恢复,通过innobackpex恢复会产生冲突,所以要全部备份。
[root@localhost ~]# innobackupex --compress --compress-threads=8 --stream=xbstream --user=root --parallel=4 ./ >back.xbstream
210521 23:18:22 [00]        ...done
xtrabackup: Transaction log of lsn (293435630) to (293435639) was copied.
210521 23:18:22 completed OK!

5.备份有压缩,原来的大小是375M
[root@localhost ~]# du -sh /data/mysql_data
375M    /data/mysql_data
[root@localhost ~]# du -sh back.xbstream
78M     back.xbstream

6.恢复,先要停掉mysql服务。由于是物理备份的,所以要把mysql的datadir地址先移走。
[root@localhost ~]# mysqld_multi stop 57
[root@localhost ~]# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld57 is not running

[root@localhost ~]# mv /data/mysql_data /data/mysql_data.bak

7.解压备份文件
[root@localhost backup]# xbstream -x < back.xbstream

8.解压后,有一些以qp为后缀的文件。由于在备份的时候用compress压缩过的。所以需要解压。
[root@localhost backup]# ll
总用量 81588
-rw-r----- 1 root root      413 5月  21 23:41 backup-my.cnf.qp
-rw-r--r-- 1 root root 81645717 5月  21 23:18 back.xbstream
drwxr-x--- 2 root root     4096 5月  21 23:41 employees
-rw-r----- 1 root root      345 5月  21 23:41 ib_buffer_pool.qp
-rw-r----- 1 root root  1838766 5月  21 23:41 ibdata1.qp
drwxr-x--- 2 root root     4096 5月  21 23:41 mysql
drwxr-x--- 2 root root     8192 5月  21 23:41 performance_schema
drwxr-x--- 2 root root     8192 5月  21 23:41 sys
-rw-r----- 1 root root      116 5月  21 23:41 xtrabackup_binlog_info.qp
-rw-r----- 1 root root      117 5月  21 23:41 xtrabackup_checkpoints
-rw-r----- 1 root root      500 5月  21 23:41 xtrabackup_info.qp
-rw-r----- 1 root root      588 5月  21 23:41 xtrabackup_logfile.qp

9.解压以后缀qp的文件。并且删除以qp为后缀的文件。需要安装qpress
[root@localhost backup]# wget http://www.quicklz.com/qpress-11-linux-x64.tar
[root@localhost backup]# tar xf qpress-11-linux-x64.tar
[root@localhost backup]# cp qpress /usr/local/bin/

[root@localhost backup]# for f in `find ./ -iname "*.qp"`;do qpress -dT4 $f $(dirname $f) && rm -rf $f;done

[root@localhost backup]# ll
总用量 92076
-rw-r--r-- 1 root root      424 5月  22 01:26 backup-my.cnf
-rw-r--r-- 1 root root 81645717 5月  21 23:18 back.xbstream
drwxr-x--- 2 root root      332 5月  22 01:26 employees
-rw-r--r-- 1 root root      350 5月  22 01:26 ib_buffer_pool
-rw-r--r-- 1 root root 12582912 5月  22 01:26 ibdata1
drwxr-x--- 2 root root     4096 5月  22 01:25 mysql
drwxr-x--- 2 root root     8192 5月  22 01:26 performance_schema
drwxr-x--- 2 root root     8192 5月  22 01:25 sys
-rw-r--r-- 1 root root       29 5月  22 01:26 xtrabackup_binlog_info
-rw-r----- 1 root root      117 5月  21 23:41 xtrabackup_checkpoints
-rw-r--r-- 1 root root      529 5月  22 01:26 xtrabackup_info
-rw-r--r-- 1 root root     2560 5月  22 01:26 xtrabackup_logfile


10.需要产生新的重做日志。
[root@localhost backup]# innobackupex --apply-log ./
InnoDB: page_cleaner: 1000ms intended loop took 32977ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.)
InnoDB: 5.7.13 started; log sequence number 293435925
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 293435944
210522 01:56:24 completed OK!

11.备份文件就变成这样了,这样就恢复为可以使用的文件了
[root@localhost backup]# ll
总用量 210860
-rw-r--r-- 1 root root      424 5月  22 01:26 backup-my.cnf
-rw-r--r-- 1 root root 81645717 5月  21 23:18 back.xbstream
drwxr-x--- 2 root root      332 5月  22 01:26 employees
-rw-r--r-- 1 root root      350 5月  22 01:26 ib_buffer_pool
-rw-r--r-- 1 root root 12582912 5月  22 01:56 ibdata1
-rw-r----- 1 root root 50331648 5月  22 01:56 ib_logfile0
-rw-r----- 1 root root 50331648 5月  22 01:56 ib_logfile1
-rw-r----- 1 root root 12582912 5月  22 01:56 ibtmp1
drwxr-x--- 2 root root     4096 5月  22 01:25 mysql
drwxr-x--- 2 root root     8192 5月  22 01:26 performance_schema
drwxr-x--- 2 root root     8192 5月  22 01:25 sys
-rw-r--r-- 1 root root       29 5月  22 01:26 xtrabackup_binlog_info
-rw-r--r-- 1 root root       29 5月  22 01:55 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root      117 5月  22 01:55 xtrabackup_checkpoints
-rw-r--r-- 1 root root      529 5月  22 01:26 xtrabackup_info
-rw-r--r-- 1 root root  8388608 5月  22 01:55 xtrabackup_logfile


12.把这个目录的文件,拷贝到mysql的datadir的指定目录,并授权
[root@localhost ~]# mkdir /data/mysql_data
[root@localhost ~]# cd backup/
[root@localhost backup]# cp -a * /data/mysql_data/
[root@localhost mysql_data]# chown -R mysql.mysql /data/mysql_data
[root@localhost mysql_data]# mysqld_multi start 57
[root@localhost mysql_data]# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld57 is running


#xtrbackup原理
1. 备份表空间
2. 在开启一个线程备份重做日志
3. 备份表空间备完成后,flush table with read lock 
4. show master status
5. unlock tables

#备份某个库的某个表
# mysqldump -uroot -p123 world city >/backup/world_city.sql

#实现所有表的单独备份
#select concat("mysqldump -uroot -p123 ",table_schema," ",table_name," --master-data=2 --single-transaction --set-gtid-purged=0  -R -E --triggers>/backup/",table_schema,"_",table_name,".sql") from information_schema.tables where table_schema not in ('sys','information_schema','performance_schema');

#备份恢复案例
7.5 故障模拟演练
7.5.1 准备数据
create database backup;
use backup
create table t1 (id int);
insert into t1 values(1),(2),(3);

7.5.2 周二 23:00全备
# mysqldump  -A  -R  --triggers --set-gtid-purged=OFF --flush-logs --max_allowed_packet=128M --master-data=2  --single-transaction|gzip > /backup/full_$(date +%F).sql.gz
7.5.3 模拟周二 23:00到周三 10点之间数据变化
use backup
insert into t1 values(11),(22),(33);

create table t2 (id int);
insert into t2 values(11),(22),(33);

7.5.4 模拟故障,删除表(只是模拟,不代表生产操作)
drop database backup;

7.6 恢复过程
7.6.1 准备临时数据库(多实例3307)
systemctl start mysqld3307
7.6.2 准备备份
(1)准备全备:
cd /backup
gunzip full_2018-10-17.sql.gz 

(2)截取二进制日志,查看全备日志位置点
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-binlog.000010', MASTER_LOG_POS=44501970;

[root@mysql-131 backup]# mysqlbinlog /data/mysql_data/mysql-binlog.000010 |grep -A12 -B12 "44501970"      
 /*!*/;
# at 44501786
# at 44501842
#210719 10:21:51 server id 131  end_log_pos 44501889 CRC32 0xa2dee31e   Table_map: `backup`.`t1` mapped to number 222
# at 44501889
#210719 10:21:51 server id 131  end_log_pos 44501939 CRC32 0xe6c0d98d   Write_rows: table id 222 flags: STMT_END_F

BINLOG '
v+H0YBODAAAALwAAAIELpwIAAN4AAAAAAAEABmJhY2t1cAACdDEAAQMAAR7j3qI=
v+H0YB6DAAAAMgAAALMLpwIAAN4AAAAAAAEAAgAB//4BAAAA/gIAAAD+AwAAAI3ZwOY=
'/*!*/;
# at 44501939
#210719 10:21:51 server id 131  end_log_pos 44501970 CRC32 0x3d0bb283   Xid = 400035
COMMIT/*!*/;
# at 44501970     #以这个位置点全备的结束点,所以要恢复全备以后的数据,就只能以这个位置点为开始,通过二进制日志获取。
#210719 10:23:07 server id 131  end_log_pos 44502035 CRC32 0x4f4d025c   GTID    last_committed=100006   sequence_number=100007
SET @@SESSION.GTID_NEXT= '4edd14fd-df90-11eb-813c-000c293ef59b:100030'/*!*/;     #如果是通过gtid来恢复,那就是这个gtid号开始计算。
# at 44502035
#210719 10:23:07 server id 131  end_log_pos 44502109 CRC32 0xded35bd2   Query   thread_id=6     exec_time=0error_code=0
SET TIMESTAMP=1626661387/*!*/;
BEGIN
/*!*/;
# at 44502109
# at 44502168
#210719 10:23:07 server id 131  end_log_pos 44502215 CRC32 0x714e69ce   Table_map: `backup`.`t1` mapped to number 226
# at 44502215
#210719 10:23:07 server id 1


#找出删除backup数据库位置点
[root@mysql-131 backup]# mysqlbinlog /data/mysql_data/mysql-binlog.000010 |grep -A12 -B12 "drop database backup"
DOL0YBODAAAALwAAALQOpwIAAAUBAAAAAAEABmJhY2t1cAACdDIAAQMAAdnUU80=
DOL0YB6DAAAAMgAAAOYOpwIAAAUBAAAAAAEAAgAB//4LAAAA/hYAAAD+IQAAAHeXqtg=
'/*!*/;
# at 44502758
#210719 10:23:08 server id 131  end_log_pos 44502789 CRC32 0x8d4dc555   Xid = 400613
COMMIT/*!*/;
# at 44502789
#210719 10:25:46 server id 131  end_log_pos 44502854 CRC32 0xd622f71a   GTID    last_committed=100009   sequence_number=100010
SET @@SESSION.GTID_NEXT= '4edd14fd-df90-11eb-813c-000c293ef59b:100033'/*!*/;    #这个gtid表示删除了backup数据库的事务id。需要跳过或者不包含,
# at 44502854
#210719 10:25:46 server id 131  end_log_pos 44502952 CRC32 0x71ec00ad   Query   thread_id=6     exec_time=0error_code=0
SET TIMESTAMP=1626661546/*!*/;
drop database backup      
/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


#以gtid方式获取全备以后的sql。
# mysqlbinlog --skip-gtids --include-gtids="4edd14fd-df90-11eb-813c-000c293ef59b:100030-100032" /data/mysql_data/mysql-binlog.000010 > bin.sql

7.6.3 恢复备份到临时库
mysql -S /data/3307/mysql.sock
set sql_log_bin=0;
source /backup/full_2018-10-17.sql
source /backup/bin.sql

7.6.4 将故障表导出并恢复到生产
mysqldump   -S /data/3307/mysql.sock backup t1 >/backup/t1.sql
mysql -uroot -p123 
set sql_log_bin=0
use backup 
source /backup/t1.sql;
set sql_log_bin=1


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值