mysql备份策略

时间:2024-03-11 13:21:47

遇到“missing signature key”错误时尝试拉取Docker镜像通常指的是Docker配置或环境问题,尤其是当使用的是旧版本的Docker时。这里有几个可能的解决方法:

更新Docker

首先,确认您的Docker版本,尽管您已经提供了版本信息(1.13.1),但这个版本相对较旧。更新到最新版本的Docker可能会解决这个问题,因为新版本可能包含了对于安全性和兼容性的改进。

在CentOS上,您可以通过以下步骤更新Docker:

1. 卸载旧版本的Docker(如果需要保留数据,请先确保备份):

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2. 安装Docker的依赖包:

sudo yum install -y yum-utils

3. 设置Docker的仓库:

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

4. 安装Docker CE:

sudo yum install docker-ce docker-ce-cli containerd.io

5. 启动Docker并设置为开机启动:

sudo systemctl start docker
sudo systemctl enable docker

尝试拉取镜像:

sudo docker pull mysql:5.7

创建自定义配置文件:在宿主机上创建一个文件(如/my/custom/my.cnf),内容如下:

[mysqld]

log-bin=mysql-bin

binlog-format=MIXED

server-id=1

运行容器并挂载配置文件

sudo docker run --name mysql-server \ 
-e MYSQL_ROOT_PASSWORD=123456 \ 
-d \ 
-v /my/custom/my.cnf:/etc/mysql/my.cnf \ 
mysql:5.7

编写shell脚本配置全量备份和增量备份的定时任务

#!/bin/bash

# MySQL容器名称
MYSQL_CONTAINER_NAME=mysql-server
# MySQL用户
MYSQL_USER=root
# MySQL密码
MYSQL_PASSWORD=123456
# 备份存储路径
BACKUP_PATH=/root/backups

# 获取当前日期和星期
CURRENT_DATE=$(date +%Y%m%d)
CURRENT_DAY=$(date +%u)

# 全量备份
function full_backup() {
    echo "Starting full backup"
    docker exec $MYSQL_CONTAINER_NAME mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --all-databases > "$BACKUP_PATH/full_$CURRENT_DATE.sql"
}

# 增量备份
function incremental_backup() {
    echo "Starting incremental backup"
    docker exec $MYSQL_CONTAINER_NAME mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD --all-databases --master-data=2 --flush-logs --single-transaction > "$BACKUP_PATH/incremental_$CURRENT_DATE.sql"
}

# 判断是否为星期六(全量备份)
if [ "$CURRENT_DAY" -eq 6 ]; then
    full_backup
else
    incremental_backup
fi

配置Crontab定时任务

输入`crontab -e`,在文件里面填入

0 1,12 * * * /path/to/mysql_backup.sh

数据还原shell

#!/bin/bash

# MySQL容器名称
MYSQL_CONTAINER_NAME=mysql-server
# MySQL用户
MYSQL_USER=root
# MySQL密码
MYSQL_PASSWORD=123456
# 指定还原的目标时间
TARGET_TIME="2024-03-10 22:30:00"
# binlog文件路径
BINLOG_PATH=/var/lib/mysql

# 显示binlog列表
docker exec $MYSQL_CONTAINER_NAME mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW BINARY LOGS;"

# 提示用户输入要操作的binlog文件名和结束时间
echo "Enter the start binlog file name:"
read START_LOG_FILE
echo "Enter the end time (2024-03-10 22:30:00), or press enter to use the current time:"
read END_TIME
if [ -z "$END_TIME" ]; then
    END_TIME=$(date +"%Y-%m-%d %H:%M:%S")
fi

# 还原数据
docker exec $MYSQL_CONTAINER_NAME mysqlbinlog --start-datetime="$TARGET_TIME" --stop-datetime="$END_TIME" $BINLOG_PATH/$START_LOG_FILE | docker exec -i $MYSQL_CONTAINER_NAME mysql -u$MYSQL_USER -p$MYSQL_PASSWORD

删除容器

sudo docker stop mysql-server
sudo docker rm mysql-server

主从同步

主服务器配置脚本(master_setup.sh)

#!/bin/bash

# MySQL容器名称
MYSQL_CONTAINER_NAME=mysql-server

# 设置MySQL root用户密码
MYSQL_ROOT_PASSWORD=123456

# 启动MySQL容器并配置主服务器
docker run --name $MYSQL_CONTAINER_NAME \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-p 3306:3306 \
-d mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=MIXED

# 等待MySQL启动
sleep 30

# 创建复制用户
docker exec $MYSQL_CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator_password';"
docker exec $MYSQL_CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';"
docker exec $MYSQL_CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "FLUSH PRIVILEGES;"

echo "Master setup complete."

从服务器配置脚本(slave_setup.sh)

#!/bin/bash

# MySQL容器名称
MYSQL_CONTAINER_NAME=mysql-server

# 设置MySQL root用户密码
MYSQL_ROOT_PASSWORD=123456

# 主服务器的IP地址
MASTER_IP="replace_with_master_ip"

# 启动MySQL容器并配置从服务器
docker run --name $MYSQL_CONTAINER_NAME \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-p 3307:3306 \
-d mysql:5.7 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci \
--server-id=2

# 等待MySQL启动
sleep 30

# 配置复制
docker exec $MYSQL_CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "CHANGE MASTER TO MASTER_HOST='$MASTER_IP',MASTER_USER='replicator',MASTER_PASSWORD='replicator_password',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;"
docker exec $MYSQL_CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "START SLAVE;"

echo "Slave setup complete."

文件传输

对于备份文件的传输,如果您希望将从一台服务器上生成的备份文件传输到另一台服务器,可以使用如下命令:

  • 使用SCP
scp /path/to/source_file username@destination_host:/path/to/destination_folder

这个命令会要求您输入目标服务器的用户密码,除非您已经设置了SSH免密登录。

数据还原

要还原到特定时间点的数据,您需要使用mysqlbinlog工具来处理二进制日志文件。以下是一般步骤:

  1. 确定需要还原的时间点之前的最近的全量备份文件。

  2. 还原该全量备份。

  3. 使用mysqlbinlog工具应用之后所有相关的二进制日志文件,直到您想要还原的时间点。例如,如果您想要还原到22:30分的数据,您可以这样做:

mysqlbinlog --start-datetime="2024-03-10 22:30:00" /path/to/binlog-files | mysql -u root -p

请替换/path/to/binlog-files为您二进制日志文件的实际路径,而且确保您指定的开始时间是您想要还原到的时间点。