Mysql数据备份与恢复

前言看完本文,删库跑路!? 再也不可能发生了!一定要养成风险操作备份数据的习惯,避免恢复数据浪费时间 。
本文内容:

  • binlog 的作用
  • MySQLdump 和 mysqlbinlog 做数据备份和数据恢复 。
  • XtraBackup 全量备份和增量备份
binlog
Mysql数据备份与恢复

文章插图
binlog 作用及配置Mysql 的 binlog (二进制日志) 是 Server 层的,不管你的存储引擎是什么都可以使用 binlog  。
binlog 记录的是数据库 DML 和 DDL 修改的数据内容,也可以用于数据的备份与恢复 。一般我们会用
binlog 也用于主从复制,从库请求主库的 binlog 写入到自己的中继日志,然后将中继日志转换为 sql ,然后将 sql 执行在从库执行 。
-- 查看是否开启 binlogSHOW VARIABLES LIKE '%log_bin%'mysql> SHOW VARIABLES LIKE '%log_bin%';+---------------------------------+-----------------------------+| Variable_name| Value|+---------------------------------+-----------------------------+| log_bin| ON|| log_bin_basename| /var/lib/mysql/binlog|| log_bin_index| /var/lib/mysql/binlog.index || log_bin_trust_function_creators | OFF|| log_bin_use_v1_row_events| OFF|| sql_log_bin| ON|+---------------------------------+-----------------------------+开启二进制日志配置log_bin 配置是否启用 binlogMysql 8.0 默认开启 binlog
log_bin_index 配置的是 binlog 日志文件的索引信息 。这个配置最好配置了之后不要修改 。
log_bin_basename 配置的是 binlog 日志的基础路径名称 。
server_id 这个也需要配置,在一个集群中这个数字不能重复 。
sql_log_bin 配置当前会话 DML 和 DDL 语句是否记录 。
[root@centos-7 mysql]# pwd/var/lib/mysql[root@centos-7 mysql]# ll | grep binlog-rw-r-----. 1 mysql mysql16162 11月 21 15:58 binlog.000013-rw-r-----. 1 mysql mysql179 11月 21 15:58 binlog.000014-rw-r-----. 1 mysql mysql3765 11月 22 14:42 binlog.000015-rw-r-----. 1 mysql mysql1700 11月 23 23:40 binlog.000016-rw-r-----. 1 mysql mysql64 11月 22 14:42 binlog.index[root@centos-7 mysql]#binlog 日志格式-- 查看当前 binlog 文件存储什么数据SHOW VARIABLES LIKE '%binlog_format%';binlog 日志格式有以下三种
STATEMENT记录的是 sql 语句 。
ROWMysql 8.0 默认采用这个格式 。记录每行的修改 。相较于 STATEMENT 它可能记录的内容会更多,但是主从复制时更安全 。
比如全表更新 update test set a=1; STATEMENT 只会记录这个 sql ,而 ROW 会记录所有数据的修改 。
MIXED当需要时,Mysql 将日志格式从 STATEMENT 切换为 ROW
比如说更新语句可能记录为逻辑 sql (STATEMENT),而插入语句记录为(ROW) 格式 。
binlog 日志格式验证创建一张表,插入 10 w 数据
DROP TABLE IF EXISTS `account`;CREATE TABLE `account` (`id` int NOT NULL AUTO_INCREMENT,`username` varchar(255) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=100000 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;DROP PROCEDURE if EXISTS insertData;CREATE PROCEDURE insertData ( )BEGINDECLARE i INT DEFAULT 1;WHILE i < 10000 DOSET i = i + 1;INSERT INTO account ( username, age )VALUES( '测试', 12 );END WHILE;END;CALL insertData ( );
  • binlog_format 在 ROW 模式下记录的是每行数据的修改
mysql> SHOW BINLOG EVENTS IN 'binlog.000018' limit 10;+---------------+-------+----------------+-----------+-------------+--------------------------------------+| Log_name| Pos| Event_type| Server_id | End_log_pos | Info|+---------------+-------+----------------+-----------+-------------+--------------------------------------+| binlog.000018 |4 | Format_desc|1 |125 | Server ver: 8.0.21, Binlog ver: 4|| binlog.000018 |125 | Previous_gtids |1 |156 ||| binlog.000018 |156 | Anonymous_Gtid |1 |236 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' || binlog.000018 |236 | Query|1 |322 | BEGIN|| binlog.000018 |322 | Table_map|1 |386 | table_id: 99 (ceshi2.account)|| binlog.000018 |386 | Update_rows|1 |8600 | table_id: 99|| binlog.000018 |8600 | Update_rows|1 |16814 | table_id: 99|| binlog.000018 | 16814 | Update_rows|1 |25028 | table_id: 99|| binlog.000018 | 25028 | Update_rows|1 |33242 | table_id: 99|| binlog.000018 | 33242 | Update_rows|1 |41456 | table_id: 99|+---------------+-------+----------------+-----------+-------------+--------------------------------------+


推荐阅读