sh脚本文件使用mysqldump备份与恢复,恢复views、function、procedure时踩坑与解决

前言

mysql进行升级,或者数据库扩容,等等具有多种方式,其中有些方式会涉及到数据库备份和恢复;数据库备份有冷备、热备、温备,这篇不记录这些,主要记录实际工作中一次使用mysqldump备份后,数据库升级,然后恢复数据库,并且数据不丢失操作。后续有时间还会再记录在实际工作中实现一次平滑的数据库升级操作。

生产环境条件真的很有限,不允许使用第三方工具,还要走很多申请单以及开放白名单等等操作,所以只能采用朴素且有效的方案去实行;

自己回家顺手搭的,就是为了总结记录一下
KylinV10离线安装mysql8.0.32

方案一:

直接到/var/lib/data下打包,丢到新版mysql服务同样位置替换,然后根据新老版本的特性去修改/etc/my.cnf配置,做到兼容;这样的物理操作,虽然是完全备份但是暴力且做到配置兼容需要花时间去尝试与纠错;我个人不太建议。

方案二:

  • 使用mysql自带的mysqldump进行数据库备份,然后物理操作视图、函数、存储过程等等,恢复时,直接source 导入执行;
  • 是想整理出sh脚本,有需要时,修改相关配置,就可以一键备份或者一键恢复的;

上传完后,需要给.sh授权,不然它们还是普通的文件

#cd到这个2个脚本的文件下执行授权:
chmod u+x *.sh

在window打开后,你在sh文件里的一些回车、换行、空格等等,可能会被linux理解为命令,执行shell脚本时出现‘$’\r: 未找到命令’错误
在这里插入图片描述

最终版根据不同人的情况去修改吧

mysql_backup.sh

#Linux查看mysql数据库所在目录
#show global variables like '%datadir%';
#备份路径
BACKUP=********
#当前时间
DATETIME=$(date +%Y-%m-%d)
echo "===备份开始==="
#数据库名称
DATABASE=******
#数据库地址
HOST=***.***.***.***
#数据库用户名
DB_USER=***
#数据库密码,带上双引号
DB_PW="***"
#创建备份目录
mkdir -p ${BACKUP}/$DATETIME
#授权
chmod -R 777 ${BACKUP}/$DATETIME
echo "备份文件存放于${BACKUP}/$DATABASE.sql"
#开始备份(完全备份一个库到一个脚本)
#mysqldump -h ${HOST}   -u${DB_USER} -p${DB_PW}  ${DATABASE} >${BACKUP}/$DATETIME/$DATABASE.sql
#完全备份多个库到一个脚本
#mysqldump -h ${HOST}   -u${DB_USER} -p${DB_PW}  --databases ${DATABASE_1} ${DATABASE_2} ${DATABASE_3}... >${BACKUP}/$DATETIME/$DATABASE_1_DATABASE_2_DATABASE_3.sql
#完全备份MySQL服务器中所有的库到一个脚本
mysqldump -u${DB_USER} -p${DB_PW} --force -A >${BACKUP}/$DATETIME/all.sql
#################  主机A,压缩成tar.gz包,并发送到另一台服务器  ###################################################
#echo "===导出成功,开始传输==="
#压缩成tar.gz包
#cd $BACKUP
#tar -zcvf $DATETIME.tar.gz $DATETIME
#备份到服务器B,使用scp从主机A发送到主机B
#scp $DATETIME.tar.gz root@ip:/home/backups/mysqlBackup
echo "===数据库备份到服务器成功==="

mysql_resume.sh

#检查mysql服务状态
#mysql_status=$(service mysqld status | grep -o 'SUCCESS')
#if [[ $mysql_status != "SUCCESS" ]];then 
#$(service mysqld restart) 
#fi
#systemctl stop mysqld
#恢复路径
BACKUP=*****
#授权
chmod -R 777 ${BACKUP}
#当前时间
DATETIME=$(date +%Y-%m-%d)
cd $BACKUP
echo "===恢复开始==="
#数据库名称
DATABASE=*****
#数据库地址
HOST=***.***.***.***
#数据库用户名
DB_USER=***
#数据库密码,带上双引号
DB_PW="***"
echo "恢复文件存放于${BACKUP}"
#开始恢复(一个个数据库导入,注意手动修改,因为备份脚本导出sql名称)
mysql -u${DB_USER} -p${DB_PW} < ${BACKUP}/$DATETIME/$DATABASE.sql
#####
echo "===数据库恢复到服务器成功==="

注意项:

  • 在使用source命令导入views、function、procedure时,要注意它们之间的 执行顺序以及外键和其他约束,不然会报xxx不存在;
  • 因为是mysql8.0.32,所以创建自定义函数时,
    报错:
    you *might* want to use the less safe log_bin_trust_function_creators variable

解决:
方法一:
如果未使用主从复制,则设置为信任即可,重启MySQL后失效。
set global log_bin_trust_function_creators=1;
在my.cnf配置文件中加上log_bin_trust_function_creators=1,永久生效。

方法二:
明确指明函数的类型,明确告知MySQL服务器这个函数不会修改数据。
super是全局级别的权限,所以必须是:.
grant super on *.* to 'user****'@'***.your_IP.***';

在创建function的语句中添加函数类型。 声明函数类型的参数有:DETERMINISTIC、NO SQL、READS SQL
DATA、MODIFIES SQL DATA和CONTAINS SQL。其中只有 DETERMINISTIC, NO SQL 和 READS
SQL DATA 被支持。这样一来相当于明确的告知MySQL服务器这个函数不会修改数据,所以它是安全的。

猜你喜欢

转载自blog.csdn.net/qq_37432174/article/details/129701044