遇到“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
工具来处理二进制日志文件。以下是一般步骤:
-
确定需要还原的时间点之前的最近的全量备份文件。
-
还原该全量备份。
-
使用
mysqlbinlog
工具应用之后所有相关的二进制日志文件,直到您想要还原的时间点。例如,如果您想要还原到22:30分的数据,您可以这样做:
mysqlbinlog --start-datetime="2024-03-10 22:30:00" /path/to/binlog-files | mysql -u root -p
请替换/path/to/binlog-files
为您二进制日志文件的实际路径,而且确保您指定的开始时间是您想要还原到的时间点。