mysql数据库的几种备份方案:
1.1、引起mysql服务器改变的任何操作( 增 删 改 没有查)
1.2、复制功能依赖于此日志
1.3、slave服务器通过复制master服务器的二进制日志完成主从复制,在执行之前保存于中继日志(relay log)中
1.4、slave服务器通常可以关闭二进制日志以提升性能
2.1、默认在安装目录下,存在mysql-bin.00001, mysql-bin.00002的二进制文件(binlog日志文件名依据my.cnf配置中的log-bin参数后面的设置为准)
[root@C7-15 ~]# vim /etc/my.cnf
..................
......
server-id=1 #开启二进制日志需要指定一个server-id
log-bin=mysql-bin #开启二进制日志
保存
二进制日志在什么时候会重新生成
[root@C7-15 ~]# systemctl restart mysql #每次重启就会生成一个
[root@C7-15 ~]# systemctl restart mysql
[root@C7-15 ~]# cd /usr/local/mysql/data/
[root@C7-15 data]# ls
auto.cnf ib_logfile0 mysql-bin.000001 performance_schema/
gs/ ib_logfile1 mysql-bin.000002 sys/
ib_buffer_pool ibtmp1 mysql-bin.index
ibdata1 mysql/ mysqld_safe.pid
mysql> flush logs; #数据库中刷新日志 也会生成一个新日志
Query OK, 0 rows affected (0.00 sec)
2.2、还有mysql-bin.index用来记录被mysql管理的二进制文件列表
2.3、如果需要删除二进制日志时,切勿直接删除二进制文件,这样会使得mysql管理混乱
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
滚动以后,mysql重新创建一个新的日志mysql-bin.000004
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 177 |
| mysql-bin.000002 | 201 |
| mysql-bin.000003 | 201 |
| mysql-bin.000004 | 154 |
+------------------+-----------+
4 rows in set (0.00 sec)
mysql> show binlog events in 'mysql-bin.000002'\G
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 123
Info: Server ver: 5.7.12-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 123
Event_type: Previous_gtids
Server_id: 1
End_log_pos: 154
Info:
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 154
Event_type: Rotate
Server_id: 1
End_log_pos: 201
Info: mysql-bin.000003;pos=4
3 rows in set (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.00 sec)
[root@C7-15 ~]# ls /usr/local/mysql/data/ |grep mysql-bin*
mysql-bin.000001
mysql-bin.index
MySQLbinlog日志结构
[root@C7-15 data]# mysqlbinlog mysql-bin.000001
mysqlbinlog: [Warning] option 'start-position': unsigned value 1 adjusted to 4
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#211212 10:47:25 server id 1 end_log_pos 123 CRC32 0x43e3c4b5 Start: binlog v 4, server v 5.7.12-log created 211212 10:47:25 at startup
ROLLBACK/*!*/;
BINLOG '
vWK1YQ8BAAAAdwAAAHsAAAAAAAQANS43LjEyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAC9YrVhEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AbXE40M=
'/*!*/;
ERROR: Error in Log_event::read_log_event(): 'Event too small', data_len: 0, event_type: 0
ERROR: Could not read entry at offset 39: Error in log format or read error.
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*/;
以上是没有进行操作查询出来的结果
注意: 需自己进行操作创建或删除
以下是进行删除wwww库后查询结果
[root@C7-15 data]# mysqlbinlog --start-position='378' mysql-bin.000001
............
......
# at 378
#211216 1:38:23 server id 1 end_log_pos 463 CRC32 0xb125d9dd Query thread_id=2
exec_time=0 error_code=0
SET TIMESTAMP=1639589903/*!*/;
drop database wwww
/*!*/;
............
.....
事件位置 | at 378 |
时间点 | 211216 1:38:23 |
服务器ID | server id 1 |
服务器ID主要用于标记日志产生的服务器,主要用于双主模型中,互为主从,确保二进制文件不会被相互循环复制 | |
事件结束位置 end_log_pos也就是下一事件开始的位置 | end_log_pos 463 |
记录类型 | Query |
线程号 | thread_id = 2 |
语句的时间戳和写入二进制日志文件的时间差 | exec_time=0 |
事件内容 | drop database wwww /*!*/; |
错误代码 | error_code=0 |
如果出现乱码原因:可能是隔离级别的原因,默认隔离级别是READ-COMMITTED,所以将隔离修改为REPEATABLE-READ就好了
[root@C7-15 ~]# vim /etc/my.cnf
[mysqld]
.........
.......
...
transaction_isolation = REPEATABLE-READ
binlog_format=MIXED
保存退出
重启mysql 重启后创建或删除都可以查看到
由 bin_log_format={ statement | row | mixed } 定义
基于语句,记录生成数据的语句
缺点:在于如果当时插入信息为函数生成,有可能不同时间点执行结果不一样
基于行数据
缺点:有时候数据量会过大
混合模式
mysql自行决定何时使用statement, 何时使用row 模式
mysql> show variables like 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set session binlog_format=statement; #修改二进制记录格式
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)
注意:5.7之前是statement,5.7之后是基于行的
log_bin = {ON|OFF} | 可以是个文件路径,自定义binlog日志文件名,使用“log_bin=“或“log-bin=“都可以,主要用于控制全局binlog的存放位置和是否开启binlog日志功能 比如:log_bin=mysql-bin 或者 log-bin=mysql-bin,这样binlog日志默认会和mysql数据放在同一目录下 |
log_bin_trust_function_creators | 是否记录在 |
sql_log_bin = {ON|OFF} | 会话级别是否关闭binlog, 如果关闭当前会话内的操作将不会记录 |
sync_binlog | 是否马上同步事务类操作到二进制日志中 |
binlog_format = {statement|row|mixed} | 二进制日志的格式,上面单独提到了 |
max_binlog_cache_size = | 二进制日志缓冲空间大小,仅用于缓冲事务类的语句 |
max_binlog_stmt_cache_size = | 语句缓冲,非事务类和事务类共用的空间大小 |
max_binlog_size = | 二进制日志文件上限,超过上限后则滚动 |
建议:将binlog日志实时备份到远程设备上,以防出现机器故障进行数据恢复;如果存放在一台机器可能数据将无法恢复
①、灾难恢复;②、审计,数据库在过去某一个时间点是什么样的;③、测试
①、用于恢复数据;②、备份结束后,需要周期性的做恢复测试
根据备份时,MySQL服务器是否在线 | |
冷备(cold backup) | 服务器离线,读写操作都不能进行 |
温备份 | 全局施加共享锁,只能读不能写 |
热备(hot backup) | 数据库在线,读写照样进行 |
根据备份时的数据集分类 |
完全备份(full backup) |
部分备份(partial backup) |
物理备份(physical backup) | 直接复制数据文件 ,打包归档 |
特点:不需要额外工具,直接归档命令即可,但是跨平台能力比较差;如果数据量超过几十个G,则适用于物理备份 | |
逻辑备份(logical backup) | 把数据抽取出来保存在sql脚本中 |
特点:可以使用文本编辑器编辑;导入方便,直接读取sql语句即可;逻辑备份恢复时间慢,占据空间大;无法保证浮点数的精度;恢复完数据库后需要重建索引 |
备份方式 | |
全量备份 (full backup) |
就是完全备份:每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础 优:备份与恢复操作简单方便 缺:数据存在大量的重复;占用大量的空间;备份与恢复时间长 |
增量备份 (incremental backup) |
在不同时间点起始备份一段数据,比较节约空间;针对的是上一次备份后有变化的数据,备份数据少,备份快,恢复慢 |
差异备份 (differential backup) |
备份从每个时间点到上一次全部备份之间的数据,随着时间增多而增多;比较容易恢复;对于很大的数据库,可以考虑主从模型,备份从服务器的内容。针对的是上一次全量备份后有变化的数据,备份数据多,备份慢,恢复快 |
mysqldump | 通常为小数据情况下的备份 |
innodb | 热备,温备 |
MyISAM, Aria | 温备 |
单线程备份恢复比较慢 |
Xtrabackup (通常用innobackupex工具) |
备份mysql大数据 |
InnoDB热备 | 增量备份 |
MyISAM温备 | 不支持增量,只有完全备份 |
属于物理备份,速度快 |
lvm-snapshot | 接近于热备的工具:因为要先请求全局锁,而后创建快照,并在创建快照完成后释放全局锁 |
使用cp、tar等工具进行物理备份 | |
备份和恢复速度较快 | |
很难实现增量备份,并且请求全局需要等待一段时间,在繁忙的服务器上尤其如此 |
工具名称 | mysqldump | xtrabackup |
备份方式 | 逻辑备份 | 物理备份 |
数据保存方式 | sq脚本 | 二进制文件 |
是否支持热备份 | 是 | 是 |
是否支持增量备份 | 是 | 是 |
备份过程 | 会锁表 | 不锁表 |
是否影响正常业务 | 影响较大 | 影响较小 |
备份和恢复性能 | 耗时较长 | 耗时较短 |
占用空间 | 占用空间小 | 占用空间较大 |
格式:mysqldump [OPTIONS] database [tables…]
参数 | 说明 |
--all-databases | 备份所有库 |
--databases db1 db2 ... | 备份指定的多个库,如果使用此命令,恢复时将不用手动创建库。或者是-B db1 db2 db3 .... |
--lock-all-tables | 请求锁定所有表之后再备份,对MyISAM、InnoDB、Aria做温备 |
--lock-table | 对正在备份的表加锁,但是不建议使用,如果其它表被修改,则备份后表与表之间将不同步 |
--single-transaction | 能够对InnoDB存储引擎实现热备 |
启动一个很大的大事物,基于MOCC可以保证在事物内的表版本一致 | |
自动加锁不需要,再加--lock-table, 可以实现热备 |
备份代码 | |
--events | 备份事件调度器代码 |
--routines | 备份存储过程和存储函数 |
--triggers | 备份触发器 |
备份时滚动日志:
--flush-logs: 备份前、请求到锁之后滚动日志,才能恢复备份时间点以后的内容
复制时的同步位置标记:主从架构中的,主服务器数据。效果相当于标记一个时间点
--master-data=[0|1|2] | |
0 | 不记录 |
1 | 记录为CHANGE MASTER语句 |
2 | 记录为注释的CHANGE MASTER语句 |
恢复过程无需写到二进制日志中
建议:关闭二进制日志,关闭其它用户连接;
备份:mysqldump+二进制日志文件;(“mysqldump >”)
周日做一次完全备份:备份的同时滚动日志
周一至周六:备份二进制日志
恢复:(“mysql < ”)或在mysql数据库中直接执行“source sql备份文件;”进行恢复。如果sql执行语句比较多,可以将sql语句放在一个文件内,将文件名命名为.sql结尾,然后在mysql数据库中使用"source 文件.sql;"命令进行执行即可!
完全备份+各二进制日志文件中至此刻的事件
1、gs 数据库的备份
格式: mysqldump -u用户 -p密码 --databases 数据库名 > /保存路径/名称.sql (后缀为.sql)
[root@C7-15 ~]# mysqldump -uroot -p111111 --databases gs > /opt/gs.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@C7-15 ~]# ls /opt/
gs.sql
删除 gs
mysql> drop database gs;
Query OK, 5 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
还原数据库
[root@C7-15 ~]# mysql -uroot -p111111 < /opt/gs.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| gs |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
2、数据备份所有的库
还原和上面的单个数据库操作一样
[root@C7-15 ~]# mysqldump -uroot -p111111 --all-databases > /opt/all_data.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
3、备份 单个表
格式: mysqldump -u用户 -p密码 数据库名 表名 > /保存路径/名称.sql (后缀为.sql)
备份表
[root@C7-15 ~]# mysqldump -u root -p111111 gs aaa> gs-aaa.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
删除表
mysql> drop table aaa;
Query OK, 0 rows affected (0.00 sec)
还原表
[root@C7-15 ~]# mysql -u root -p111111 gs < gs-aaa.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
备份库中的多个表
备份 gs库 的 aaa 表和 yg 表
备份两个表
[root@C7-15 ~]# mysqldump -u root -p111111 gs aaa yg > aaayg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
删除
mysql> drop table aaa;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table yg;
Query OK, 0 rows affected (0.01 sec)
查看
mysql> show tables;
+--------------+
| Tables_in_gs |
+--------------+
| jsb |
| jsb_1 |
| jsb_2 |
+--------------+
3 rows in set (0.00 sec)
还原
[root@C7-15 ~]# mysql -u root -p111111 gs < aaayg.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> show tables;
+--------------+
| Tables_in_gs |
+--------------+
| aaa |
| jsb |
| jsb_1 |
| jsb_2 |
| yg |
+--------------+
5 rows in set (0.00 sec)
mysql的包含关系:
数据库(数据表)
数据表(表结构+数据)
4、导出结构不导出数据
默认将 gs 库下所有表的表结构全部导出
格式: mysqldump -u用户 -p密码 -d 库表 > 名称.sql
[root@C7-15 ~]# mysqldump -u root -p111111 -d gs > gsjg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
还原表结构
[root@C7-15 ~]# mysql -u root -p111111 gs < gsjg.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
导出单个数据表的表结构
[root@C7-15 ~]# mysqldump -u root -p111111 -d gs aaa yg > aaagsbg.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
5、导出数据不导出结构
导出数据gs库中所有表的数据
格式: mysqldump -u用户 -p密码 -t 库名 > 文件名称.sql
[root@C7-15 ~]# mysqldump -u root -p111111 -t gs > sj.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
导出数据 gs 库中 yg 表的数据
备份表中数据 前提是里面要有数据
[root@C7-15 ~]# mysqldump -u root -p111111 -t gs yg > ygsj.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
这里做了一个还原表结构
mysql> select * from yg;
Empty set (0.00 sec)
还原数据
[root@C7-15 ~]# mysql -u root -p111111 gs < ygsj.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
查看
mysql> select * from yg;
+-----------+-----------+--------+-----------+--------+
| 职业 | 姓名 | 编号 | 学历 | 工资 |
+-----------+-----------+--------+-----------+--------+
| 工程师 | 小V | 5 | 小学 | 5000 |
| 云计算 | 哈哈哈 | 6 | 大专 | 1000 |
| 工程师 | 小林 | 4 | 本科 | 20000 |
| NULL | NULL | NULL | NULL | NULL |
| 打杂 | 小二 | 250 | 幼儿园 | 50 |
+-----------+-----------+--------+-----------+--------+
5 rows in set (0.00 sec)
命令格式:mysqlbinlog [参数] log-files
四种参数说明 | |
--start-datetime | 指定二进制日志的起始日期 |
--stop-datetime | 指定二进制日志的结束日期 |
--start-position | 指定二进制日志的起始位置 |
--stop-position | 指定二进制日志的结束位置 |
1、根据mysql二进制日志文件位置进行备份
[root@C7-15 ~]# mysqlbinlog --start-position='62087' --stop-position='62389' /usr/local/mysql/data/mysql-bin.000001 >hhh.sql
使用备份文件还原
[root@C7-15 ~]# mysql -uroot -p111111 < hhh.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
2、根据mysql二进制日志文件位置恢复
[root@C7-15 ~]# mysqlbinlog --start-position='62087' --stop-position='62389' /usr/local/mysql/data/mysql-bin.000001|mysql -uroot -p111111
mysql: [Warning] Using a password on the command line interface can be insecure.
3、根据mysql二进制日志文件时间恢复
恢复 10:53:01 之后 10:53:49之前的数据
[root@C7-15 ~]# mysqlbinlog --start-datetime='2021-12-17 10:53:01' --stop-datetime='2021-12-17 10:53:49' /usr/local/mysql/data/mysql-bin.000001 |mysql -uroot -p111111
mysql: [Warning] Using a password on the command line interface can be insecure.
刷新日志
[root@C7-15 ~]# mysqladmin -u root -p111111 flush-logs;
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
快照 |
1、事务日志跟数据文件必须在同一个卷上 |
2、刚刚创立的快照卷,里面没有任何数据,所有数据均来源于原卷 |
3、一旦原卷数据发生修改,修改的数据将复制到快照卷中,此时访问数据一部分来自于快照卷,一部分来自于原卷 |
4、当快照使用过程中,如果修改的数据量大于快照卷容量,则会导致快照卷崩溃 |
5、快照卷本身不是备份,只是提供一个时间一致性的访问目录 |
基于快照备份几乎为热备 |
1、创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁 |
2、如果是Inoodb引擎, 当flush tables 后会有一部分保存在事务日志中,却不在文件中。 因此恢复时候,需要事务日志和数据文件 |
但释放锁以后,事务日志的内容会同步数据文件中,因此备份内容并不绝对是锁释放时刻的内容,由于有些为完成的事务已经完成,但在备份数据中因为没完成而回滚。 因此需要借助二进制日志往后走一段 |
快照备份注意事项 |
1、事务日志跟数据文件必须在同一个卷上 |
2、创建快照卷之前,要请求MySQL的全局锁;在快照创建完成之后释放锁 |
3、请求全局锁完成之后,做一次日志滚动;做二进制日志文件及位置标记(手动进行) |
1、几乎是热备 在大多数情况下,可以在应用程序仍在运行的时候执行备份。无需关机,只需设置为只读或者类似只读的限制
2、支持所有基于本地磁盘的存储引擎 它支持MyISAM, Innodb, BDB,还支持 Solid, PrimeXT 和 Falcon
3、快速备份 只需拷贝二进制格式的文件,在速度方面无以匹敌
4、低开销 只是文件拷贝,因此对服务器的开销很细微
5、容易保持完整性 想要压缩备份文件吗?把它们备份到磁带上,FTP或者网络备份软件 -- 十分简单,因为只需要拷贝文件即可
6、快速恢复 恢复的时间和标准的MySQL崩溃恢复或数据拷贝回去那么快,甚至可能更快,将来会更快
7、免费 无需额外的商业软件,只需Innodb热备工具来执行备份
1.1、快照备份mysql的缺点:
1、需要兼容快照 -- 这是明显的
2、需要超级用户(root) 在某些组织,DBA和系统管理员来自不同部门不同的人,因此权限各不一样
3、停工时间无法预计,这个方法通常指热备,但是谁也无法预料到底是不是热备 -- FLUSH TABLES WITH READ LOCK 可能会需要执行很长时间才能完成
4、多卷上的数据问题 如果你把日志放在独立的设备上或者你的数据库分布在多个卷上,这就比较麻烦了,因为无法得到全部数据库的一致性快照。不过有些系统可能能自动做到多卷快照
[root@C7-15 ~]# fdisk /dev/sdb
.........
.....
命令(输入 m 获取帮助):p #查看
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x07712cdc
设备 Boot Start End Blocks Id System
命令(输入 m 获取帮助):n #创建
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p #主分区
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048): #默认
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): #默认
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):w #保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@C7-15 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
[root@C7-15 ~]# vgcreate vg0 /dev/sdb1
Volume group "vg0" successfully created
[root@C7-15 ~]# lvcreate -L +10G -n lv0 vg0
Logical volume "lv0" created.
[root@C7-15 ~]# mkfs.xfs /dev/vg0/lv0
meta-data=/dev/vg0/lv0 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@C7-15 ~]# mkdir /var/lv0/
[root@C7-15 ~]# mount /dev/vg0/lv0 /var/lv0/
[root@C7-15 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_c7--15-root xfs 50G 8.9G 42G 18% /
devtmpfs devtmpfs 478M 0 478M 0% /dev
tmpfs tmpfs 489M 0 489M 0% /dev/shm
tmpfs tmpfs 489M 6.7M 482M 2% /run
tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sr0 iso9660 4.3G 4.3G 0 100% /media/cdrom
/dev/sda1 xfs 1014M 125M 890M 13% /boot
/dev/mapper/centos_c7--15-home xfs 47G 33M 47G 1% /home
tmpfs tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/vg0-lv0 xfs 10G 33M 10G 1% /var/lv0
[root@C7-15 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos_c7-15 -wi-ao---- 46.99g
root centos_c7-15 -wi-ao---- 50.00g
swap centos_c7-15 -wi-ao---- 2.00g
lv0 vg0 -wi-ao---- 10.00g
删除创建的lvs
systemctl stop mysqld
umount /dev/vg0/lv0 /usr/local/mysql/data
lvremove /dev/vg0/lv0
vgremove vg0
pvremove /dev/sdb1
lvs
mysql的数据目录在/usr/local/mysql/data,密码是1111111
[root@C7-15 ~]# ps -ef|grep mysql
root 929 1 0 17:12 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/logs/mysqld.pid
mysql 1272 929 0 17:12 ? 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/logs/mysqld.log --pid-file=/usr/local/mysql/logs/mysqld.pid --port=3306
root 93147 1306 0 17:56 pts/0 00:00:00 grep --color=auto mysql
[root@C7-15 ~]# systemctl stop mysqld
[root@C7-15 ~]# cd /usr/local/mysql/data/
[root@C7-15 data]# tar -cf - . | tar xf - -C /var/lv0/
[root@C7-15 data]# umount /var/lv0/
[root@C7-15 data]# mount /dev/vg0/lv0 /usr/local/mysql/data/
[root@C7-15 data]# df -Th
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos_c7--15-root 50G 8.9G 42G 18% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sr0 4.3G 4.3G 0 100% /media/cdrom
/dev/sda1 1014M 125M 890M 13% /boot
/dev/mapper/centos_c7--15-home 47G 33M 47G 1% /home
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/vg0-lv0 10G 167M 9.9G 2% /usr/local/mysql/data
[root@C7-15 data]# systemctl start mysqld #开启mysql
[root@C7-15 data]# mysql -uroot -p111111
mysql> show master status;
Empty set (0.00 sec)
mysql> flush logs;
Query OK, 0 rows affected (0.00 sec)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
-----重新打开一个窗口
[root@C7-15 ~]# lvcreate -L +4G -s -n mysql /dev/vg0/lv0
Using default stripesize 64.00 KiB.
Logical volume "mysql" created.
[root@C7-15 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos_c7-15 -wi-ao---- 46.99g
root centos_c7-15 -wi-ao---- 50.00g
swap centos_c7-15 -wi-ao---- 2.00g
lv0 vg0 owi-aos--- 10.00g
mysql vg0 swi-a-s--- 4.00g lv0 0.00
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
开启mysql的二进制日志。然后重启mysql
[root@C7-15 ~]# vim /etc/my.cnf
........
server-id=1
log-bin=mysqlbin
保存
[root@C7-15 ~]# systemctl restart mysqld
mysql> create database user;
Query OK, 1 row affected (0.00 sec)
mysql> use user;
Database changed
mysql> create table user(id int(40),name varchar(40));
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables_in_user |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
mysql> insert into user values(1,'小V'),(10,'小Q');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
[root@C7-15 ~]# cp /usr/local/mysql/data/mysqlbin.000001 /opt/
——————模拟数据库故障
[root@C7-15 ~]# systemctl stop mysqld
[root@C7-15 ~]# umount /dev/vg0/lv0
[root@C7-15 ~]# lvconvert --merge /dev/vg0/mysql
Merging of volume vg0/mysql started.
lv0: Merged: 100.00%
[root@C7-15 ~]# mount /dev/vg0/lv0 /usr/local/mysql/data/
[root@C7-15 ~]# systemctl start mysqld
--------------------------
mysql> use user;
ERROR 1049 (42000): Unknown database 'user'
mysqslbinlog /opt/mysqlbin.000001 #查看二进制日志
..................
# at 740
#211221 17:02:15 server id 1 end_log_pos 771 CRC32 0x4f2b152e Xid = 10
数据恢复根据二进制日志进行恢复
[root@C7-15 ~]# mysqlbinlog --start-position='4' --stop-position='771' /opt/mysqlbin.000001|mysql -uroot -p111111
mysql: [Warning] Using a password on the command line interface can be insecure.
mysql> use user;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_user |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)
mysql> select * from user;
+------+------+
| id | name |
+------+------+
| 1 | 小V |
| 10 | 小Q |
+------+------+
2 rows in set (0.00 sec)
-----------------------
快照一次性
[root@C7-15 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
home centos_c7-15 -wi-ao---- 46.99g
root centos_c7-15 -wi-ao---- 50.00g
swap centos_c7-15 -wi-ao---- 2.00g
lv0 vg0 -wi-ao---- 10.00g
Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部开源
安装
上传:percona-toolkit-2.2.19-1.noarch.rpm 和 percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz
[root@C7-15 ~]# tar xf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz -C /usr/src/
[root@C7-15 ~]# cd /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/
[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cp bin/* /usr/bin/
[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5
......................
.............
可以使用yum安装 percona-toolkit-2.2.19-1.noarch.rpm
[root@C7-15 percona-xtrabackup-2.4.5-Linux-x86_64]# cd
[root@C7-15 ~]# yum localinstall percona-toolkit-2.2.19-1.noarch.rpm
软件包安装完后一共有4个可执行文件:innobackupex、xbcrypt、xbstream、xtrabackup
[root@C7-15 ~]# ll /usr/src/percona-xtrabackup-2.4.5-Linux-x86_64/bin/
总用量 225988
lrwxrwxrwx 1 root root 10 11月 25 2016 innobackupex -> xtrabackup
-rwxr-xr-x 1 root root 5179300 11月 25 2016 xbcloud
-rwxr-xr-x 1 root root 3020 11月 25 2016 xbcloud_osenv
-rwxr-xr-x 1 root root 5001985 11月 25 2016 xbcrypt
-rwxr-xr-x 1 root root 5071619 11月 25 2016 xbstream
-rwxr-xr-x 1 root root 216142648 11月 25 2016 xtrabackup
其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制
xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互
innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等;简单来说,innobackupex 在 xtrabackup 之上做了一层封装
一般情况下,我们是希望能备份 MyISAM 表的,虽然我们可能自己不用 MyISAM 表,但是 mysql 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行;另外一个原因是我们可能需要保存位点信息
--host |
指定主机 |
--user |
指定用户名 |
--password |
指定密码 |
--port |
指定端口 |
--databases |
指定数据库 |
--incremental |
创建增量备份 |
--incremental-basedir |
指定包含完全备份的目录 |
--incremental-dir | 指定包含增量备份的目录 |
--apply-log |
对备份进行预处理操作 |
--redo-only |
不回滚未提交事务 |
--copy-back |
恢复备份目录 |
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
2个工具之间的交互和协调是通过控制文件的创建和删除来实现的,主要文件有:xtrabackup_suspended_1、xtrabackup_suspended_2、xtrabackup_log_copied
innodb有两个文件:redo文件 + lbd文件
Redo文件:存储引擎层(innodb)生成的日志,主要为了保证数据的可靠性
Ibd文件:Inodb引擎开启的表空间,用来存储表的数据和索引
[root@C7-15 ~]# mkdir /backups
[root@C7-15 ~]# innobackupex --user=root --password=111111 /backups/
211221 03:53:17 innobackupex: Starting the backup operation
[root@C7-15 ~]# ls /backups/
2021-12-21_17-58-40
注意: 保证mysql是开启状态要不然会报错
ls /backups/2021-12-21_17-58-40
backup-my.cnf 备份用到的配置选项信息文件
xtrabackup_binlog_info mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
xtrabackup_checkpoints 备份的类型、状态和LSN状态信息文件
xtrabackup_logfile 备份的日志文件
2.1、恢复
合并数据,使数据文件处于一致性的状态
[root@C7-15 ~]# innobackupex --user=root --password=111111 --addly-log /backups/2021-12-21_17-58-40/
.................
........
[root@C7-15 ~]# ls /usr/local/mysql/data/
aaa auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema sys
[root@C7-15 ~]# rm -rf /usr/local/mysql/data/*
[root@C7-15 ~]# ls /usr/local/mysql/data/
[root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_17-58-40/
......................
............
...
[root@C7-15 ~]# ll /usr/local/mysql/data/
总用量 12324
drwxr-x--- 2 root root 6 12月 21 18:25 2021-12-21_18-23-50
drwxr-x--- 2 root root 6 12月 21 18:25 2021-12-21_18-23-59
drwxr-x--- 2 root root 51 12月 21 18:25 2021-12-21_18-24-11
drwxr-x--- 2 root root 137 12月 21 18:25 aaa
-rw-r----- 1 root root 323 12月 21 18:25 ib_buffer_pool
-rw-r----- 1 root root 12582912 12月 21 18:25 ibdata1
drwxr-x--- 2 root root 4096 12月 21 18:25 mysql
drwxr-x--- 2 root root 8192 12月 21 18:25 performance_schema
drwxr-x--- 2 root root 8192 12月 21 18:25 sys
drwxr-x--- 2 root root 52 12月 21 18:25 user
-rw-r----- 1 root root 464 12月 21 18:25 xtrabackup_info
修改属主属组
[root@C7-15 ~]# chown -R mysql:mysql /usr/local/mysql/data/
1、innobackupex全量备份,并指定备份目录路径
2、在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求
3、恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径
3.1、增量备份
使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推
PXB 是支持增量备份的,但是只能对 InnoDB 做增量,InnoDB 每个 page 有个 LSN 号,LSN 是全局递增的,page 被更改时会记录当前的 LSN 号,page中的 LSN 越大,说明当前page越新(最近被更新)。每次备份会记录当前备份到的LSN(xtrabackup_checkpoints 文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每个 ibd 文件最终备份出来的是增量 delta 文件
MyISAM 是没有增量的机制的,每次增量备份都是全部拷贝的
增量备份过程和全量备份一样,只是在 ibd 文件拷贝上有不同
3.2、增量备份案例
[root@C7-15 ~]# systemctl restart mysqld
[root@C7-15 ~]# rm -rf /backups/*
[root@C7-15 ~]# innobackupex --user=root --password=111111 /backups/
mysql> create database ku1;
Query OK, 1 row affected (0.00 sec)
mysql> use ku1;
Database changed
mysql> create table bnent(name int(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into bnent values(1),(2),(3),(40);
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from bnent;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 40 |
+------+
4 rows in set (0.00 sec)
mysql> quit
Bye
使用innobackupex进行增量备份
[root@C7-15 ~]# innobackupex --user=root --password=111111 --incremental /backups/ --incremental-basedir=/backups/2021-12-21_18-33-06/
[root@C7-15 ~]# ll /backups/
总用量 4
drwxr-x--- 9 root root 300 12月 21 18:33 2021-12-21_18-33-06 #全量备份数据目录
drwxr-x--- 10 root root 4096 12月 21 18:35 2021-12-21_18-35-43 #增量备份数据目录
————————————————————————————————————————————————————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints #查看全量备份的
backup_type = full-backuped #备份类型为全量备份
from_lsn = 0 #lsn从0开始
to_lsn = 2546737 #lsn到2546737结束
last_lsn = 2546746
compact = 0
recover_binlog_info = 0
——————————————————————————————————————————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-35-43/xtrabackup_checkpoints #查看增量备份的
backup_type = incremental #备份类型为增量备份
from_lsn = 2546737 #lsn从2546737开始
to_lsn = 2552779 #lsn到啊2552779结束
last_lsn = 2552788
compact = 0
recover_binlog_info = 0
3.3、增量恢复
[root@C7-15 ~]# rm -rf /usr/local/mysql/data/* #删除数据目录所有数据
———————————— #合并全备数据目录,确保数据的一致性
[root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/
.............
....
—————————————— #将增量备份数据合并到全备数据目录当中
[root@C7-15 ~]# innobackupex --apply-log --redo-only /backups/2021-12-21_18-33-06/ --incremental-dir=/backups/2021-12-21_18-35-43/
...........
...
——————————————————
[root@C7-15 ~]# cat /backups/2021-12-21_18-33-06/xtrabackup_checkpoints
backup_type = log-applied #查看到数据备份类型是增加
from_lsn = 0 #lsn从0开始
to_lsn = 2552779 #lsn结束号为最新的lsn
last_lsn = 2552788
compact = 0
recover_binlog_info = 0
3.4、进行恢复
[root@C7-15 ~]# innobackupex --copy-back /backups/2021-12-21_18-33-06/
[root@C7-15 ~]# chown -R mysql.mysql /usr/local/mysql/data
[root@C7-15 ~]# mysql -uroot -p111111 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------------------+
| Database |
+------------------------------+
| information_schema |
| #mysql50#2021-12-21_18-23-50 |
| #mysql50#2021-12-21_18-23-59 |
| aaa |
| ku1 |
| mysql |
| performance_schema |
| sys |
| user |
+------------------------------+
结论
1、增量备份使用参数 --incremental 指定需要备份到哪个目录,使用 --incremental-dir 定全备目录
2、进行数据备份时,使用参数 --apply-log redo-only 先合并全备数据目录数据,确保全备数据目录数据的一致性
3、再将增量备份数据使用参数 --incremental-dir 合并到全备数据当中
4、再使用全备数据进行恢复数据注意:如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复