一、背景
在一个风和日丽的下午,姜同学正在研究动态规划算法,突然被临时传递了一个需求,大致就是测试的同学想要做自动化测试。具体的细节略过,姜同学认为需求还比较合理,可以做。要求如下: ● 无损备份线上数据库到文件 ● 支持表级备份 ● 支持字段脱敏 ● 支持版本管理 ● 支持一键还原
二、需求分析
三.实施方案
备份
还原
编写脚本
看着就是复制黏贴很机械化的需求呀,一般这种操作姜同学都不会干第二次的,所以就写个脚本安排吧。
启动
参数列表:罗列代码中涉及的参数和含义
参数 | 含义 |
---|---|
SLAVE_PASS | 密码,备份和设置主从的时候用 |
MYSQL_PASS | 新容器的密码,登录用 |
#!/bin/bash
RDS_PASS=$1
MYSQL_PASS=$2
RDS_HOST='源库IP'
RDS_PORT='源库端口'
RDS_USER='源库用户名'
read -p "请输入想要同步的库用英文,隔开:" TODO_DB
read -p "请输入想要同步的表用英文,支持通配(没有直接回车):" TODO_TABLE
if test -z $RDS_PASS
then
read -p "请输入RDS从库密码:" RDS_PASS
fi
if test -z $MYSQL_PASS
then
read -p "请输入新的MySQL容器的初始密码:" MYSQL_PASS
fi
echo "RDS从库密码为:$RDS_PASS"
echo "MySQL容器初始化密码为:$MYSQL_PASS"
mkdir -p /pins/rds-slave/data/mysql/conf/
touch /pins/rds-slave/data/mysql/conf/my.cnf
cat > /pins/rds-slave/data/mysql/conf/my.cnf << EOF
[mysqld]
server-id=66666
default-storage-engine=INNODB
character_set_server = utf8
gtid_mode=on #开启gtid模式
enforce_gtid_consistency=on #强制gtid一致性,开启后对于特定create table不被支持
#复制的表
#复制的库
#不复制的库
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
[mysqld_safe]
character_set_server=utf8
[mysql]
default-character-set=utf8
[mysql.server]
default-character-set=utf8
[client]
default-character-set=utf8
EOF
REPLICATE__DB=(${TODO_DB//,/ })
for DB in ${REPLICATE__DB[@]}
do
sed -i "8areplicate-do-db=$DB" /pins/rds-slave/data/mysql/conf/my.cnf
done
REPLICATE__TABLE=(${TODO_TABLE//,/ })
for TABLE in ${REPLICATE__TABLE[@]}
do
sed -i "7areplicate-do-table=$TABLE" /pins/rds-slave/data/mysql/conf/my.cnf
done
#安装MySQL 5.7.30与RDS同步
docker run -p 13007:3306 --name version-mysql -v /pins/rds-slave/data/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD="$MYSQL_PASS" -e TZ="Asia/Shanghai" -d --restart=always mysql:5.7.30
if [ $? -eq 0 ]; then
echo -e "