全量备份的两种方式:
1、innobackupex备份和恢复
#####备份
#!/bin/bash
if [ -f ~/.bash_profile ]; then
. ~/.bash_profile
fi
backup_dir=/data/mysql_backup/backup
t1_now=$(date "+%Y-%m-%d %H:%M:%S")
innobackupex --defaults-file=/etc/my.cnf --user=root --password=$password /data/mysql_backup/backup
if [ $? == 0 ] ; then
t2_now=$(date "+%Y-%m-%d %H:%M:%S")
#sql="insert into innodb_backup_info(start_time,end_time,backup_result) values('${t1_now}','${t2_now}','SUCCESS')"
#mysql -uroot -pxxx backupinfo -e "${sql}"
echo "$t2_now innodbbacupx backup success" >>/tmp/backup.log
else
t2_now=$(date "+%Y-%m-%d %H:%M:%S")
#sql="insert into innodb_backup_info(start_time,end_time,backup_result) values('${t1_now}','${t2_now}','FAILED')"
#mysql -uroot -pxxx backupinfo -e "${sql}"
echo "$t2_now backup unsucess,please check the reason and concat whis the database administrator" >>/tmp/backup.log
# exit
fi
#t1_now=date -%F
# 定义备份删除多少天之前的备份。默认为(7+1)*24小时
retention=7
file_name=$(date -d "- $retention day" +%F)
#delete_file_name=$(ls $backup_dir/|grep $file_name)
#echo $delete_file_name
#cd $backup_dir
#cd /mysql_backup/backup
#if [ "$delete_file_name" == "" ] ; then
#echo "文件不存在,没有可以删除的文件"
#else
# if [ $PWD == $backup_dir ] ; then
# echo "路径正确"
# rm -rf $delete_file_name
# fi
#fi
find /data/mysql_backup/backup -mtime +7 -a -name "20[12][0-9]-[0-1][0-9]-[0-3][0-9]_*" |xargs -i rm -rf {}
echo "this is the really end"
#####【注意以下操作需在新搭建的数据库上操作,请勿直接生产环境操作】
#恢复数据初始化
innobackupex --use-memory=512M --apply-log 2017-08-23_21-23-46/
-use-memory=512M:意思是恢复数据指定使用的内存为512M;(因为这是虚拟机,所以只是测试,要是线上的服务器64G我们可以使用32G来恢复数据,这样速度会更快些)
--apply-log:指定需要恢复的日志文件
#恢复备份到mysql目录
innobackupex --defaults-file=/etc/my.cnf --copy-back ./2017-08-23_21-23-46/
#####实践中因为此种方式备份有结构文件frm和数据文件ibd,所以我们搭建好mysql数据库后,直接新建好表结构,然后用备份中的ibd文件替换过去,重启mysql数据直接就有了
2、mysqldump备份和恢复
#备份(所有库加参数--all-databases)
docker exec mysql sh -c 'exec mysqldump -uroot -p$password --databases $database_name' \
> /data/mysql/mysql_backup/lease_db_`date +\%F`.sql
######【注意以下操作需在新搭建的数据库上操作,请勿直接生产环境操作】
#恢复1
mysql -uroot -p123456 < /data/mysql/mysql_backup/lease_db_`date +\%F`.sql
#恢复2
#实际生产中是恢复单个的表,因此操作如下
#使用sed过滤出单表数据
sed -n '/INSERT INTO `table_name`/p' lease_db_`date +\%F`.sql > table_name.sql
#使用grep过滤出单表数据
cat lease_db_`date +\%F`.sql |grep -E 'INSERT INTO `table_name`' > table_name.sql