mysql备份详解

一、逻辑备份

1.mysqldump基础语法

[root@hw-yyx ~]# mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help

2.常用场景

输入密码,然后导出指定数据库:

[root@master mysqlback]# mysqldump -u root -p testback > testback.sql
Enter password: 
[root@master mysqlback]# ls
dump_file.sql  testback.sql
[root@master mysqlback]# vim testback.sql 

导出特定表:

[root@master mysqlback]# mysqldump -u root -p  testback --tables tab_testbak > test_bakTab.sql
Enter password: 
[root@master mysqlback]# ls
dump_file.sql  testback.sql  test_bakTab.sql
[root@master mysqlback]# vim test_bakTab.sql 

导出多个表:

[root@master mysqlback]# mysqldump -u root -p testback table1 table2 > test_morebakTab.sql 

导出所有表和结构:

[root@master mysqlback]# mysqldump -u root -p --all-databases > all_dbs.sql
Enter password: 
[root@master mysqlback]# ls
all_dbs.sql  dump_file.sql  testback.sql  test_bakTab.sql

导出指定数据,不含表结构:
–no-create-info

#--no-create-info:不包括创建表结构的 SQL 语句。
#--skip-add-locks:在导出数据时不添加锁表语句。
#--skip-disable-keys:在导出数据时不包括禁用外键检查的语句。
#--skip-lock-tables:在导出数据时不锁定表。
[root@master mysqlback]# mysqldump -u root -p --no-create-info --skip-add-locks --skip-disable-keys --skip-lock-tables testback tab_testbak > data_only.sql
Enter password: 
[root@master mysqlback]# ls
all_dbs.sql  data_only.sql  dump_file.sql  testback.sql  test_bakTab.sql
[root@master mysqlback]# vim data_only.sql 

在这里插入图片描述
导出表结构不含数据:
–no-data

[root@master mysqlback]# mysqldump -u root -p --no-data testback tab_testbak > structure_only.sql
Enter password: 
[root@master mysqlback]# ls
all_dbs.sql  data_only.sql  dump_file.sql  structure_only.sql  testback.sql  test_bakTab.sql
[root@master mysqlback]# vim structure_only.sql 

导出并压缩:

[root@master mysqlback]# mysqldump -u root -p --no-data testback tab_testbak | gzip > structure_only.sql.gz
Enter password: 
[root@master mysqlback]# ls
all_dbs.sql    dump_file.sql       structure_only.sql.gz  test_bakTab.sql
data_only.sql  structure_only.sql  testback.sql

恢复库

#先模拟删除库
#登录
[root@master mysqlback]# mysql -uroot -p
Enter password:
#删除
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testback           |
+--------------------+
5 rows in set (0.00 sec)

mysql> drop database testback;
Query OK, 2 rows affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> \q
Bye

##开始恢复数据
[root@master mysqlback]# mysql -u root -p'123456' -e "CREATE DATABASE testback;" && mysql -u root -p testback < testback.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
Enter password: 
[root@master mysqlback]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.7.44-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testback           |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

恢复表

#模拟丢失表
[root@master mysqlback]# mysql -uroot -p  testback -e  "drop table  wh_student02;"
Enter password: 
# 方式一
#testback 数据库名  
#test_bakTab.sql表备份文件
[root@master mysqlback]# mysql -u root -p  testback  < test_bakTab.sql 
Enter password: 
# 方式二
#先登录
[root@master mysqlback]# mysql -uroot -p
#之前做了主从复制 这里关掉二进制日志 实际根据业务选择操作
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
# 进库
mysql> use testback;
Database changed
#恢复
mysql> source /mysqlback/test_bakTab.sql ;
# 查看
mysql> show tables;
+--------------------+
| Tables_in_testback |
+--------------------+
| tab_testbak        |
+--------------------+
1 row in set (0.00 sec)

恢复表结构:

[root@master mysqlback]# mysql -u root -p -D testback  < structure_only.sql
Enter password: 

恢复数据

[root@master mysqlback]# mysql -u root -p -D testback < data_only.sql 
Enter password: 

导出数据为自定义文档

参数 into outfile
# 配置导出数据安全目录
secure_file_priv=/mysqlback
# 授权
[root@master mysqlback]# chown mysql:mysql /mysqlback
# 完成后冲去mysql服务
[root@master mysqlback]# systemctl restart mysqld
# 导出数据
[root@master mysqlback]# mysql -u root -p  -D testback -e "select * from tab_testbak into outfile '/mysqlback/t6.bak';"
Enter password: 
# 导入数据
[root@master mysqlback]# mysql -u root -p -D testback -e "LOAD DATA INFILE '/mysqlback/t6.bak' INTO TABLE tab_testbak  CHARACTER SET utf8mb4;"
Enter password: 

# into outfile可加参数
fields terminated by ',' :字段以逗号分割
lines terminated by '\n':结尾换行

二、Mysql bin-log日志恢复数据

开启:

[root@master mysqlback]# vim /etc/my.cnf
log-bin=/var/log/mysql/mysql-bin
server-id=1

查看:

语法:
mysqlbinlog binlog_file > output_file.sql

例:
[root@master mysqlback]# mysqlbinlog /var/log/mysql/mysql-bin.000001  > mysql-bin000001.sql
[root@master mysqlback]# ls
all_dbs.sql    dump_file.sql        structure_only.sql     testback.sql     test_exclude.sql
data_only.sql  mysql-bin000001.sql  structure_only.sql.gz  test_bakTab.sql
[root@master mysqlback]# vim mysql-bin000001.sql 

条件过滤

[root@master ~]# mysqlbinlog --start-datetime="2024-08-01 00:00:00" --stop-datetime="2024-09-02 23:59:59"  /var/log/mysql/mysql-bin.000001  > filtered_output.sql
[root@master ~]# ls
anaconda-ks.cfg  filtered_output.sql

常用参数
--help:
显示帮助信息。

--base64-output:
控制是否输出以 base64 编码的事件数据。

--start-position=#:
从指定的位置开始读取日志文件。

--stop-position=#:
在指定的位置停止读取日志文件。

--start-datetime="YYYY-MM-DD HH:MM:SS":
从指定的日期和时间开始读取日志文件。

--stop-datetime="YYYY-MM-DD HH:MM:SS":
在指定的日期和时间停止读取日志文件。

--start-transaction=#:
从指定的事务开始读取日志文件。

--stop-transaction=#:
在指定的事务停止读取日志文件。

--server-id=#:
只显示来自特定服务器 ID 的事件。

--short-form:
显示简短格式的日志信息。

--host=#:
指定远程服务器的地址。

--port=#:
指定远程服务器的端口号。

--user=#:
指定远程服务器的用户名。

--password:
提示输入远程服务器的密码。

--result-file=#:
将输出保存到指定的文件。

--force-read:
即使日志文件不完整也强制读取。

--force-if-open:
即使日志文件被其他进程打开也强制读取。

--to-last-log:
读取到最后一个日志文件。

--offset=#:
从指定的字节偏移量开始读取。

--debug-info:
显示调试信息。

--debug:
显示详细调试信息。

--verbose:
显示更详细的输出。

--raw:
以原始格式输出日志事件。

--show-charset:
显示字符集信息。

--show-warnings:
显示警告信息。

--event:
只显示指定类型的事件。

--regex:
使用正则表达式过滤事件。

--databases:
只显示指定数据库的事件。

--read-from-remote-server:
从远程服务器读取 binlog。

恢复

例: 根据时间过滤出可读数据sql文件 然后导入即可
[root@master mysqlback]# mysqlbinlog --start-datetime="2024-08-26 16:23:00" --stop-datetime="2024-08-26 16:59:59"  /var/log/mysql/mysql-bin.000005  > /mysqlback/filtered_output3.sql
[root@master mysqlback]# mysql -u root -p   testback  < /mysqlback/filtered_output3.sql  
Enter password: 

这里的恢复本质上是将binlog根据参数截取出丢失的数据,并转化为可读且mysql能直接导入的sql文件

三、物理备份

1.完全备份

# 创建备份目录
[root@master mysqlback]# mkdir /xtrabackup/full -p
# 完全备份数据库
[root@master mysqlback]# innobackupex --user=root --password='123456' /xtrabackup/full
[root@master mysqlback]# cd /xtrabackup/full/
[root@master full]# ls
2024-08-26_18-29-59
[root@master full]# cd 2024-08-26_18-29-59/
[root@master 2024-08-26_18-29-59]# ls
backup-my.cnf   ibdata1  performance_schema  testback                xtrabackup_checkpoints  xtrabackup_logfile
ib_buffer_pool  mysql    sys                 xtrabackup_binlog_info  xtrabackup_info




# 恢复数据
# 先模拟删除部分数据 或者表
# 然后关闭mysql服务 
[root@master 2024-08-26_18-29-59]# systemctl stop mysqld

# 清理环境删除或者移走mysql存放的数据目录下的数据。
# 查看目录在哪里
[root@master 2024-08-26_18-29-59]# cat /etc/my.cnf
datadir=/var/lib/mysql

[root@master 2024-08-26_18-29-59]# cd /var/lib/mysql
[root@master mysql]# ls
auto.cnf         client-key.pem  ib_logfile1              master-relay-bin.000003  mysql               relay-log.info   testback
ca-key.pem       ib_buffer_pool  master.info              master-relay-bin.000004  performance_schema  server-cert.pem
ca.pem           ibdata1         master-relay-bin.000001  master-relay-bin.000005  private_key.pem     server-key.pem
client-cert.pem  ib_logfile0     master-relay-bin.000002  master-relay-bin.index   public_key.pem      sys
[root@master mysql]# mkdir -p /tmp/test
[root@master mysql]# mv * /tmp/test  
[root@master mysql]# ls
[root@master mysql]# ll
总用量 0
[root@master mysql]#  rm -rf /var/log/mysqld.log			#可选操作
[root@master mysql]#  rm -rf /var/log/mysql-slow/slow.log  #可选操作


# 恢复
# 先验证
[root@master mysql]# innobackupex --apply-log /xtrabackup/full/2024-08-26_18-29-59
# 再执行
[root@master mysql]# innobackupex --copy-back /xtrabackup/full/2024-08-26_18-29-59/
# 修改数据目录权限
[root@master mysql]# chown mysql.mysql  /var/lib/mysql -R
# 重启并查看数据已恢复
[root@master mysql]# systemctl start mysqld

2.增量备份

基于完全备份后新增数据

# 创建新增备份文件目录
[root@master incremental]# mkdir /xtrabackup/incremental -p
# 基于全量备份进行第一次新增备份  第一次新增  这里新增数据的操作就省略掉了 
[root@master incremental]# innobackupex --user=root --password='123456' --incremental /xtrabackup/incremental --incremental-basedir=/xtrabackup/full/2024-08-26_18-29-59
[root@master incremental]# ls
2024-08-26_19-07-12 
# 基于第一次新增备份的第二次新增备份  同样省略了插入数据操作
[root@master incremental]# innobackupex --user=root --password='123456' --incremental /xtrabackup/incremental --incremental-basedir=/xtrabackup/incremental/2024-08-26_19-07-12
[root@master incremental]# ls
2024-08-26_19-07-12  2024-08-26_19-10-33
# 模拟数据修饰
# 省略

# 恢复数据
# 关闭mysql服务 
# 清理环境
# 上述操作同上面全量备份一致
# 恢复 先全量恢复 然后第一次 第二次  要一层一层迭代恢复
# 第一次全量 --redo-only  类似于预恢复文件  最后基于这个文件进行恢复
[root@master incremental]# innobackupex --apply-log --redo-only /xtrabackup/full/2024-08-26_18-29-59/
# 指向第一次增量备份文件
[root@master incremental]# innobackupex --apply-log --redo-only /xtrabackup/full/2024-08-26_18-29-59/ incremental-dir=/xtrabackup/incremental/2024-08-26_19-07-12
# 指向第二次增量备份文件
[root@master incremental]# innobackupex --apply-log --redo-only /xtrabackup/full/2024-08-26_18-29-59/   --incremental-dir=/xtrabackup/incremental/2024-08-26_19-10-33

# 通过--redo-only 指向的文件进行正式恢复
[root@master incremental]# innobackupex --copy-back /xtrabackup/full/2024-08-26_18-29-59/
[root@master incremental]# chown -R mysql.mysql /var/lib/mysql
[root@master incremental]# systemctl start mysqld
# 查看验证

3.差异备份

主要用到incremental-basedir这个参数  其他操作一致
语法如下:
[root@mysql-server ~]# innobackupex --user=root --password='123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2019-08-20_15-42-02/  #备份目录基于周一的备份

差异备份:备份自上次完全备份之后的改变。所以,如果有2个连续差异备份,两个差异备份会有重复。恢复时,只需一个差异备份和最后一次完全备份。
增量备份:备份自上次(低一级)备份之后的改变。通常分级别1到9,0级即为完全备份。假设备份次序是0,2,3,1,5,则备份5会备份自3之后的改变。恢复时,通常需要多个增量备份和最后一次完全备份。差异备份可说是增量备份的一个特例,即级别1。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值