跳到主要内容
版本:v6.x

手动备份恢复数据库

提示:v6 已提供官方脚本 backup_master_v6.sh / restore_master_v6.sh(用法见如何搬迁主控),效果与本文手动命令一致,推荐优先使用。以下命令适合需要自定义备份内容的场景。

手动备份数据库

登录主控服务器执行(先从 /opt/cdnfly-go/conf/config.yaml 读取数据库配置):

MYSQL_IP=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'host:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_PORT=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'port:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_DB=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'database:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_USER=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'user:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_PASS=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'password:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
mysqldump -e --single-transaction --no-tablespaces --default-character-set=utf8 --skip-add-locks -R -f --max_allowed_packet=16777216 --net_buffer_length=16384 -h$MYSQL_IP -u$MYSQL_USER -p"$MYSQL_PASS" -P$MYSQL_PORT $MYSQL_DB --ignore-table=$MYSQL_DB.node_monitor_log > /root/cdn.sql;
mysqldump -d -e --single-transaction --no-tablespaces --default-character-set=utf8 --skip-add-locks -R -f --max_allowed_packet=16777216 --net_buffer_length=16384 -h$MYSQL_IP -u$MYSQL_USER -p"$MYSQL_PASS" -P$MYSQL_PORT $MYSQL_DB node_monitor_log >> /root/cdn.sql;
gzip /root/cdn.sql;

说明:node_monitor_log 是节点监控日志表,数据量大且可丢失,第一条命令跳过其数据,第二条命令仅导出该表结构(与官方备份脚本行为一致)。

手动恢复数据库

假设数据库备份文件在 /root/cdn.sql.gz,执行如下命令恢复:

systemctl stop master-api.service master-task.service;
MYSQL_IP=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'host:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_PORT=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'port:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_DB=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'database:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_USER=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'user:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
MYSQL_PASS=$(grep -A6 '^mysql:' /opt/cdnfly-go/conf/config.yaml | grep 'password:' | head -1 | sed 's/.*: *//;s/["'\'']//g');
mysql -h$MYSQL_IP -u$MYSQL_USER -p"$MYSQL_PASS" -P$MYSQL_PORT -e "drop database $MYSQL_DB;create database $MYSQL_DB;";
gunzip < /root/cdn.sql.gz | mysql -h$MYSQL_IP -u$MYSQL_USER -p"$MYSQL_PASS" -P$MYSQL_PORT $MYSQL_DB;
systemctl start master-api.service master-task.service;

注意:

  1. /root/cdn.sql.gz 换成你的备份文件路径。
  2. 恢复会删除并重建整个数据库,执行前请确认备份文件完整可用。
  3. 恢复期间主控服务(master-api、master-task)处于停止状态,节点会暂时无法连接主控,服务启动后自动恢复。