mysql备份


docker安装mysql并持久化到宿主机,并开启二进制日志

一.首先执行命令,创建docker对mysql的映射文件

bash 复制代码
mkdir /home/mydata/mysql/{conf,data,logs,mysql-files} -p

二.在conf目录下添加配置文件,添加mysql的配置,log-bin和server_id需要,其他可以自行选择

bash 复制代码
cd /home/mydata/mysql/conf
vi my.cnf
bash 复制代码
[mysqld]
# 设置3306端口
port=3306
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
# 服务端使用的排序规则
collation-server=utf8mb4_general_ci
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用"mysql_native_password"插件认证
# mysql 8.0 需要设置 mysql_native_password
default_authentication_plugin=mysql_native_password
# 关闭 only_full_group_by
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

# mysql 时区
default-time-zone = '+8:00'

# 最大连接数量
max_connections=10000

# 不再进行反解析(ip不反解成域名),这样可以加快数据库的反应时间。
skip-name-resolve

# binlog 日志存放路径
log-bin=mysql-binlog
# 日志中记录每一行数据被修改的形式
binlog-format=ROW
# 当前机器的服务 ID, 如果为集群时不能重复,不要和 canal 的 slaveId 重复
server_id=1

三.使用docker启动容器,配置mysql名字,端口映射,mysql文件地址映射,密码,和mysql镜像名字

bash 复制代码
docker run -dti --name mysql -p 3306:3306 \
-v /home/mydata/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /home/mydata/mysql/data:/var/lib/mysql \
-v /home/mydata/mysql/mysql-files:/var/lib/mysql-files \
-v /home/mydata/mysql/logs:/logs \
-e MYSQL_ROOT_PASSWORD=test123456 \
--restart=always mysql:5.7.24

四.执行备份策略前,先做好scp命令的准备

生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份,一直回车就行

bash 复制代码
ssh-keygen -t rsa -b 4096

生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份。-p指定端口

bash 复制代码
ssh-copy-id -p22 root@8.134.255.243

五.完全备份

因为是使用的docker部署的mysql,因此需要先进入mysql的docker容器内进行操作

docker exec -it hjt-mysql /bin/bash

在/opt目录下新建一个mysqlData文件作为备份的镜像文件夹

mkdir mysqlData

这个是备份一个数据库的命令

bash 复制代码
mysqldump -u root -p数据库密码 --databases 数据库名称 > /opt/mysqlData/数据库名称.sql

这个是备份整个数据库的命令

bash 复制代码
mysqldump -u root -p数据库密码 --all databases > /opt/mysqlData/保存后的名称.sql

备份的文件如何恢复呢?,命令如下

bash 复制代码
mysql -uroot -p 要恢复的数据库名称 </opt/mysqlData/之前备份这个要恢复的数据库名称.sql

六.增量备份

首先需要开启二进制日志功能

bash 复制代码
vim /etc/my.cnf
bash 复制代码
[mysqld]
# 添加这些,之前添加过的话这个就忽略吧
log-bin=mysql-bin
binlog_format = MIXED				# 指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1

完全备份数据库的命令

bash 复制代码
# date是保存时间自动记录为当前的时间,方面以后恢复数据的时候定位
mysqldump -u root -p 数据库名称 > /opt/mysqlData/数据库名称_$(date +%F).sql

如果是备份某个数据库的某张表

bash 复制代码
mysqldump -u root -p  数据库名称 表名称  > /opt/mysqlData/数据库名称_表名称$(date +%F).sql

增量备份逻辑,先生成一个二进制日志,然后开始你的数据库操作,生成二进制日志之后的所有操作会被记录到这个日志中

mysqladmin -u root -p flush-logs

你可以通过这个命令来查看二进制日志里面记录的信息

bash 复制代码
mysqlbinlog --no-defaults --base64-output=decode-rows -v \
/var/lib/mysql/mysql-binlog.000001 #这个不是固定的,要查看生成的日志文件名具体是多少

如果想看到我们写入的sql语句格式,则需要设置 binlog_rows_query_log_events = 1

--start-position 可以通过偏移量进行查询

--start-datetime 通过开始时间来查询

--stop-datetime 通过结束时间查询

mysqlbinlog  --base64-output=decode-rows -v /var/lib/mysql/mysql-binlog.000001 --start-datetime='2022-11-23 09:18:22'

当我们想要恢复数据的时候,可以执行下面的命令,但是要注意,你执行上面的生成的binlog日志的时候,要观察生成的文件名字是多少,然后执行下面的命令来恢复

mysqlbinlog --no-defaults  /var/lib/mysql/mysql-binlog.000002  | mysql -u root -p

可以观察binlog日志内部的信息,这样可以精确的恢复到某个时间段的状态

bash 复制代码
mysqlbinlog --no-defaults  # 这里可以加start-datetime,stop-datetime,start-positon等\
/var/lib/mysql/mysql-binlog.000001  | mysql -u root -p

七.执行定时任务来定时备份

编写脚本

bash 复制代码
#!/bin/bash

# 定义变量
DB_NAME="test"
BACKUP_DIR="/root/mysql_save"
TARGET_SERVER="root@117.72.11.154" # 要进行输送的目标服务器的用户名称和ip地址
TARGET_DIR="/root/mysql_save_test"

# 当前日期
CURRENT_DATE=$(date +%F)
# 当前时间
CURRENT_TIME=$(date +%T)

# 全量备份函数
function full_backup() {
    echo "开始全量备份"
    mysqldump -u root -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/full_backup_$CURRENT_DATE.sql

    # 使用SCP传输备份文件
    scp $BACKUP_DIR/full_backup_$CURRENT_DATE.sql $TARGET_SERVER:$TARGET_DIR/
}

# 增量备份函数
function incremental_backup() {
    echo "开始增量备份"
    # 复制新的binlog文件到备份目录
    cp /home/mydata/mysql/data/mysql-binlog.* $BACKUP_DIR/

    # 使用SCP传输增量备份文件
    scp $BACKUP_DIR/mysql-binlog.* $TARGET_SERVER:$TARGET_DIR/
}

# 判断今天是否为周六(全量备份)
if [ $(date +%u) -eq 6 ]; then
    full_backup
else
    incremental_backup
fi

设置定时任务

bash 复制代码
crontab -e
bash 复制代码
# 每天中午12点进行增量备份
0 12 * * * /root/backup_full.sh

# 每天凌晨1点进行增量备份
0 1 * * * /root/backup_full.sh

数据恢复

sql 复制代码
SHOW BINARY LOGS;

提取binlog日志

bash 复制代码
mysqlbinlog --start-datetime="2024-03-16 22:00:00" --stop-datetime="2024-03-16 22:30:00" /path/to/binlog-file > /path/to/backup/restore.sql

将日志应用到数据库

bash 复制代码
mysql -u root -p < /path/to/backup/restore.sql
相关推荐
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6756 小时前
数据库基础1
数据库
我爱松子鱼6 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231118 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql