一、逻辑备份
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。