常用的测试磁盘 IO 性能的命令.
动机
开发环境数据库需要定期备份,并把数据同步到异地。我们使用 xtrabackup + 阿里云 nas 的方案,以下是方案具体操作步骤。脚本通用的前提是需要数据库部署按规范来。
数据库数据较大,使用 mysqldump 会出现各种意外,因此我们选型xtrabackup。这里为什么使用容器镜像来做备份和恢复?xtrabackup8.0 版本需要的运行库比较高级,rocky linux 9 目前不支持运行,所以用 docker 的方案比较便捷。
备份
需要备份的实例,这里脚本把端口抽象出来了,同一个机器多个数据库实例改一下端口即可.
脚本内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#!/bin/bash
# 变量
PORT=3306
BACKUP_DATE=$(date "+%Y%m%d")
BACKUP_BASE_DIR=/data1/storages/backup
BACKUP_DIR=mysql-${PORT}-${BACKUP_DATE}
# 备份
docker run --rm -v /var/run/mysqld-${PORT}:/var/run/mysqld-${PORT} -v /data1/storages/mysql-${PORT}/:/data1/storages/mysql-${PORT}/ -v ${BACKUP_BASE_DIR}/${BACKUP_DIR}:/backup zlsk/percona-xtrabackup:8.0 /usr/bin/xtrabackup --defaults-file=/data1/storages/mysql-${PORT}/my.cnf --datadir=/data1/storages/mysql-${PORT}/data -uroot -p37214728 -P${PORT} -S /var/run/mysqld-${PORT}/mysql8.0.sock --backup --target-dir=/backup 2>&1 >> /opt/devops/scripts/mysqlbackup-${PORT}.log
if [ $? -ne 0 ]; then
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} 备份失败" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
exit 1
fi
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} 备份成功" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
# 打包
cd ${BACKUP_BASE_DIR}
tar -czf ${BACKUP_DIR}.tar.gz ${BACKUP_DIR}
if [ $? -ne 0 ]; then
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} 打包失败" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
exit 1
fi
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} 打包成功" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
# 拷贝
mv ${BACKUP_DIR}.tar.gz /mnt/${BACKUP_DIR}.tar.gz
if [ $? -ne 0 ]; then
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} copy失败" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
exit 1
fi
echo "`date '+%Y-%m-%d %H:%M:%S'` mysql ${PORT} copy成功" >> /opt/devops/scripts/mysqlbackup-${PORT}.log
# 清理
rm -rf mysql-${PORT}-${BACKUP_DATE}
|
定时任务,定时备份及定时清理过期文件。
1
2
3
4
5
6
7
|
# 3306 数据库备份
00 03 * * * /opt/devops/scripts/mysqlbackup-3306.sh
# 13310 数据库备份
00 05 * * * /opt/devops/scripts/mysqlbackup-13310.sh
# 清理7天前备份数据
00 00 * * * find /mnt/ -maxdepth 1 -type f -atime +7 -exec rm -f {} \;
|
还原
还原需要2个步骤,第一步先 prepare 。
1
2
|
# /data/server/mysql-recovery/backup_data 此目录为备份数据所在目录
docker run --rm -v /data/server/mysql-recovery/backup_data:/backup xxx/devops/percona-xtrabackup:8.0 /usr/bin/xtrabackup --prepare --target-dir=/backup
|
第二步,还原数据到数据目录。
1
2
3
|
# /data/server/mysql-recovery/backup_data 此目录为备份数据所在目录
# /data1/storages/mysql-3306/data 数据库实例的数据目录
docker run --rm -v /data/server/mysql-recovery/backup_data:/backup -v /data1/storages/mysql-3306/data:/data1/storages/mysql-3306/data xxx/devops/percona-xtrabackup:8.0 /usr/bin/xtrabackup --copy-back --target-dir=/backup --datadir=/data1/storages/mysql-3306/data
|
最后
数据库运行的 docker compose,其实 docker compose 和 my.cnf 也备份了一份在备份目录下,为了加强对上面脚本数据目录的理解,附上数据库实例的 docker yml 文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
services:
mysql-3306:
image: xxx/devops/mysql:8.0.36
restart: always
container_name: mysql-3306
ports:
- 3306:3306
environment:
TZ: "Asia/Shanghai"
MYSQL_ROOT_PASSWORD: "xxx"
privileged: true
volumes:
- /data1/storages/mysql-3306/my.cnf:/etc/mysql/my.cnf
- /data1/storages/mysql-3306/data:/data1/storages/mysql-3306/data
- /var/run/mysqld-3306:/var/run/mysqld-3306
command:
- --lower_case_table_names=1
- --secure-file-priv=NULL
|