误删数据库怎么办(数据备份与故障恢复)

1.数据备份

1.1 测试环境准备

规划数据卷:

mkdir -p /usr/local/mysql/data
mkdir -p /usr/local/mysql/log
mkdir -p /usr/local/mysql/conf

在conf目录添加my.cnf,内容如下:

[mysqld]
## 局域网唯一
server_id=1
## 指定不需要同步的数据库名称
binlog-ignore-db=master
## 开启二进制日志功能,并设置
log-bin=/var/lib/mysql/mysql-bin
## 设置二进制日志使用内存大小事务
binlog_cache_size=1M
## 设置使用的二进制日志格式mixed,statement,row
binlog_format=ROW
## 二进制日志过期清理时间,默认值为0表示不自动清理。
expire_logs_days=7
## 开启慢日志查询
slow_query_log = ON
## 指定慢日志查询位置
slow_query_log_file = /var/lib/mysql/slow/tmp_slow.log
## 指定慢sql查询阈值,单位为秒
long_query_time = 1

定义docker-compose.yml

version: "3.7"
services:
  mysql:
    image: mysql:5.7.25
    container_name: mysql-advance
    command: --default-authentication-plugin=mysql_native_password
    # restart: always
    environment:
      # root用户密码
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
    ports:
      - 33080:3306
    volumes:
      - /usr/local/mysql/master/data:/var/lib/mysql
      - /usr/local/mysql/master/log:/var/log/mysql
      - /usr/local/mysql/master/conf:/etc/mysql

1.2 数据备份实现

1.2.1 备份类型介绍

㈠ 逻辑备份

  • 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL)。
  • 适用于中小型数据库,效率相对较低。 一般在数据库正常提供服务的前提下进行,如:mysqldump、mydumper、into outfile(表的导出导入)等。

㈡ 物理备份

  • 直接复制数据库文件
  • 适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
  • 一般是在数据库彻底关闭或者不能完成正常提供服务的前提下进行的备份);如:tar、cp、xtrabackup(数据库可以正常提供服务)、lvm snapshot、rsync等

㈢ 在线热备(冗余)

  • MySQL的replication架构,如M-S|M-S-S|M-M-S等
  • 实时在线备份

1.2.2 逻辑备份-mysqldump

本质:导出的是sql语句文件

优点:无论是什么存储引擎,都可以用mysqldump备成sql语句

缺点:速度较慢,导入时可能会出现格式不兼容的突发状况.无法直接做增量备份.

提供三种级别的备份,表级,库级和全库级

㈠ 基本语法

表级别备份
mysqldump [OPTIONS] database [tables]
库级别备份
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
全库级别备份
mysqldump [OPTIONS] --all-databases [OPTIONS]

㈡ 常用参数

常用参数 描述说明
–flush-logs, -F 开始备份前刷新日志
–flush-privileges 备份包含mysql数据库时刷新授权表
–lock-all-tables, -x MyISAM一致性,服务可用性(针对所有库所有表)
–lock-tables, -l 备份前锁表(针对要备份的库)
–single-transaction 适用InnoDB引擎,保证一致性,服务可用性【重要】
–master-data=2 表示将二进制日志位置和文件名写入到备份文件并在dump文件中注释掉这一行
–master-data=1 表示将二进制日志位置和文件名写入到备份文件,在dump文件中不注释这一行

–master-data参数其他说明:

1)恢复时会执行,默认是1
2)需要RELOAD privilege并必须打开二进制文件
3)这个选项会自动打开–lock-all-tables,关闭–lock-tables

㈢ 举例说明

表级备份:
# mysqldump -p123 db01 emp > /tmp/mysqlbak/emp.sql	备份单个表
# mysqldump -p123 db01 emp dept > /tmp/mysqlbak/emp.sql	备份多个表

表级恢复:
# mysql -p db01 </tmp/mysqlbak/emp.sql
或者在mysql数据库内使用source命令来执行外部的sql文件
mysql> source /tmp/mysqlbackup/emp.sql	

库级备份:
# mysqldump --databases db01 -p > /tmp/mysqlbak/db01.sql		备份单个库
# mysqldump --databases db01 db02 -p > /tmp/mysqlbak/db01.sql	备份多个库

库级恢复:
# mysql -p </tmp/mysqlbak/db01.sql 
mysql> source /tmp/mysqlbak/db01.sql 

全库级备份:
# mysqldump --all-databases --master-data --single-transaction > all.sql

练习导出priactice_db:

– 备份

mysqldump -uroot -proot practice_db > tmp.sql

– 恢复 (自己维护新库的名称)

mysql -p practice_db < /tmp.sql

㈣ 小结

  1. mysqldump工具备份的是SQL语句,故备份不需要停服务
  2. 使用备份文件恢复时,要保证数据库处于运行状态
  3. 只能实现全库,指定库,表级别的某一时刻的备份,本身不能增量备份
  4. 适用于中小型数据库

1.2.3 增量备份与删库恢复

1.先进行全量备份

# 1.备份前确定binlog的最新pos日志为
# 1.1 查看binlog最新日志信息
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |     6479 |              | master           |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
-- Position=6479表示当前最新日志未为6479,我们备份的话,就截止到这个节点
# 1.2 查看所有binlog日志信息
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |   3069344 |
| mysql-bin.000003 |       154 |
| mysql-bin.000004 |      6479 |
+------------------+-----------+
4 rows in set (0.00 sec)
-- File_size 表示每个日志文件的终止索引位

# 2.备份当前数据(此时数据从6479节点开始备份)
 mysqldump -uroot -p practice_db > /practice.sql

2.模拟故障删库

# 3.模拟写操作
mysql> insert into teacher values ('04','zhaoliu');
# 然后查看pos变化情况
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       177 |
| mysql-bin.000002 |   3069344 |
| mysql-bin.000003 |       154 |
| mysql-bin.000004 |      6763 |
+------------------+-----------+
4 rows in set (0.00 sec)
-- 发现由6479变为了6763
# 4.接下来模式故障-删库操作
mysql> drop database practice_db;
Query OK, 4 rows affected (0.01 sec)
# 5.如何恢复数据到删库前呢?关键如何确定删库前的pos位置?
mysqlbinlog --start-position=6479 --base64-output=decode-rows -v mysql-bin.000004
# 我们发现删库的pos位置为6828
# at 6828 # 删库pos位置
#230904  0:21:20 server id 1  end_log_pos 6941 CRC32 0x5a9138bb         Query   thread_id=12    exec_time=0     error_code=0
SET TIMESTAMP=1693758080/*!*/;
drop database practice_db

3.数据恢复

# 所以我们只需导出从6479到6828的数据即可,接下来先构建practice_db数据库,然后导入原来dump备份数据
mysql> create database practice_db DEFAULT CHARSET utf8;
Query OK, 1 row affected (0.00 sec)
# 导入备份数据
mysql practice_db  -p < ./tmp.sql 
# 最后恢复数据
mysqlbinlog --start-position=6479 --stop-position=6828 ./mysql-bin.000004 | mysql practice_db  -p

1.2.4 逻辑导入导出(了解

无论是什么存储引擎,以下方式本身是一种数据导出的方法,同时可以用来辅助备份,它可以对一个表的其中一列或者某几列做备份。备份的是数据记录。

㈠ 语法

导出数据:

select  字段  into outfile '/path/file' from table_name; 
select * into outfile '/tmp/emp.txt' from db01.emp;

恢复数据:

方法1:
load data local infile '/tmp/emp.txt' into table emp; 
说明:该方法要求在编译数据库时要加上--enable-local-infile参数才可以使用
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON   |
+---------------+-------+
方法2:
# mysqlimport dbname /path/file

1.2.5 物理备份

可将系统中mysql/data目录打包压缩,用户其它机器基于docker数据恢复(只需挂在在相同容器目录下即可!)

猜你喜欢

转载自blog.csdn.net/2302_77094379/article/details/132711266