公司使用的阿里云的RDS,设置的备份策略是每天凌晨3点进行全量备份。
备份文件都在阿里云上面,内网没有做任何备份。
自从携程事件出现后,我觉得公司内网也要做下数据库备份。
程序代码都在内网svn服务器,所以线上即使全删除了,也没有关系。
数据库备份,本来考虑是导出sql文件,发现单独一个千万数据表,导出sql文件大小有12G。
要是全部数据库导出,数据太庞大了。
后来发现阿里云的RDS全量备份文件,只有9G左右。所以将备份文件下载到内网,然后恢复出来就可以了。下载链接是动态链接,每次需要手动下载,比较麻烦。如果需要自动下载,需要自己开发api程序,这个暂时还没有开发好。
线上用的是RDS mysql 5.6,所以内网安装了一台mysql服务器,版本是mysql 5.6.24
方法如下:
yum -y install ncurses-devel cmake
创建用户和用户组
groupadd mysql
useradd -g mysql mysql
usermod -s /sbin/nologin mysql
创建目录
mkdir -p /data/3306/data /data/3306/logs
解压编译
tar zxvf mysql-5.6.24.tar.gz -C /usr/src
cd /usr/src/mysql-5.6.24
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/3306/data \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/data/3306/mysqld.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DEXTRA_CHARSETS=all \
-DWITH_EMBEDDED_SERVER=1 \
-DWITH_SSL=bundled \
-DWITH_DEBUG=0 \
-DENABLE_DOWNLOADS=1
安装
make
make install
初始化
/usr/local/mysql/scripts/mysql_install_db \
--basedir=/usr/local/mysql \
--datadir=/data/3306/data \
--user=mysql
编辑配置文件
cd /usr/local/mysql
cp my.cnf my.cnf.bak
vi my.cnf
skip-name-resolve
basedir = /usr/local/mysql
datadir = /data/3306/data
port = 3306
server_id = 2
socket = /data/3306/mysqld.sock
pid-file = /data/3306/mysql.pid
max_allowed_packet=16M
log-error = /data/3306/logs/error.log
设置启动脚本,增加到开机自启动
chown mysql:mysql -R /data/3306
cp /usr/src/mysql-5.6.24/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 2345 mysqld on
编辑环境变量
vi /etc/profile
最后一行添加
PATH=$PATH:/usr/local/mysql/bin
启动mysql
source /etc/profile
/etc/init.d/mysqld start
增加授权用户
mysql -u root -p
grant all PRIVILEGES on *.* to xx@‘%‘ identified by ‘xx123‘;
flush privileges;
exit;
安装XtraBackup
由于RDS是使用XtraBackup,所以服务器必须安装,注意版本和阿里云的一样,是XtraBackup-2.0.6
https://www.percona.com/downloads/XtraBackup/XtraBackup-2.0.6/binary/Linux/x86_64/percona-xtrabackup-2.0.6-523.tar.gz
安装组件
yum -y install perl-Time-HiRes libaio* openssl*
yum clean all
安装xtrabackup
tar zxvf percona-xtrabackup-2.0.6-523.tar.gz -C /usr/src/
mv /usr/src/percona-xtrabackup-2.0.6 /usr/local/xtrabackup
添加环境变量
vi /etc/profile
最后一行添加
PATH=$PATH:/usr/local/xtrabackup/bin
source /etc/profile
查看版本
xtrabackup -v
下载解压备份脚本(针对RDS备份文件)
wget http://oss.aliyuncs.com/aliyunecs/rds_backup_extract.sh?
chmod 755 rds_backup_extract.sh
创建目录
mkdir -p /data/3309/data /data/3309/logs
mkdir -p /data/3310/data /data/3310/logs
mkdir -p /data/3311/data /data/3311/logs
解压备份
./rds_backup_extract.sh -f /backup/db_base/hins550127_xtra_20150601030412.tar.gz -C /data/3309/data
恢复数据
innobackupex --defaults-file=/data/3309/data/backup-my.cnf --apply-log /data/3309/data/
最后一行出现"innobackupex: completed OK!"就说明成功了
编辑配置文件
vi /data/3309/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /data/3309/data
port = 3309
server_id = 3
socket = /data/3309/mysqld.sock
max_allowed_packet=16M
log-error = /data/3309/logs/error.log
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
编辑启动脚本
vi /data/3309/start.sh
#!/bin/sh
port=3309
rundir=/data/"$port"
echo "$rundir"
/usr/local/mysql/bin/mysqld_safe --defaults-file="$rundir"/my.cnf --basedir=/usr/local/mysql --port="$port" --user=mysql --datadir="$rundir"/data --pid-file="$rundir"/mysql.pid --socket=/"$rundir"/mysqld.sock &
echo "done"
编辑停止脚本
vi /data/3309/stop.sh
#!/bin/sh
port=3309
rundir=/data/"$port"
pid_file="$rundir"/mysql.pid
if test -f "$pid_file"
then
mysqld_pid=`cat $pid_file`
echo "Killing mysqld with pid $mysqld_pid"
kill -TERM $mysqld_pid
# mysqld should remove the pid_file when it exits, so wait for it.
sleep 1
while [ -s $pid_file -a "$flags" != aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ]
do
[ -z "$flags" ] && echo "Wait for mysqld to exit\c" || echo ".\c"
flags=a$flags
sleep 1
done
if [ -s $pid_file ]
then echo " gave up waiting!"
elif [ -n "$flags" ]
then echo " done"
fi
# delete lock for RedHat / SuSE
if test -f /var/lock/subsys/mysql
then
rm /var/lock/subsys/mysql
fi
else
echo "No mysqld pid file found. Looked for $pid_file."
fi
设置权限
chmod 755 /data/3309/*.sh
chown mysql:mysql -R /data/3309
启动3309实例
/data/3309/start.sh
查看端口
netstat -napt | grep 3309
添加授权账户
mysql -u root -S /data/3309/mysqld.sock
grant all PRIVILEGES on *.* to xx@‘%‘ identified by ‘xx123‘;
flush privileges;
exit;
测试登陆,打开数据库,特别注意innodb表打开是否正常。
如果出现以下
InnoDB: Progress in percent: 0 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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
等待很长时间
说明备份文件有问题,重新下载另外的备份文件就可以了。
用wget下载,注意链接用引号,比如 wget -c "下载链接"
wget 下载占用了大量带宽,所以我用迅雷下载,进行限速。
每次手动下载,恢复的时候,需要执行上面一系列步骤,比较麻烦,所以自己写了一个脚本。
#!/bin/bash
#提取时间今天时间
totime=`date -d today +%Y%m%d`
time=`ls -l --color=auto /backup/db_base/ | awk ‘{print $9}‘ | grep $totime`
/data/3309/stop.sh
rm -rf /data/3309/data/*
/root/rds_backup_extract.sh -f /backup/db_base/$time -C /data/3309/data
innobackupex --defaults-file=/data/3309/data/backup-my.cnf --apply-log /data/3309/data/
chown mysql:mysql -R /data/3309
/data/3309/start.sh
sleep 3
mysql -u root -S /data/3309/mysqld.sock -e "grant all PRIVILEGES on *.* to xx@‘%‘ identified by ‘xx123‘;flush privileges;"
sleep 1
echo "db_base恢复完成"
#删除5天的备份文件
find /backup/db_base -ctime 5 -type f -name "*.tar.gz" -exec rm {} \;
本文出自 “陨落星空” 博客,请务必保留此出处http://xiao987334176.blog.51cto.com/2202382/1657935
原文地址:http://xiao987334176.blog.51cto.com/2202382/1657935