目录

Linux操作系统-xtrabackup基础操作

常用的测试磁盘 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