备份数据库
添加目录路径到环境变量(非必要步骤,可跳过)
我们的脚本中使用到了$JIRA_HOME环境变量,该变量指向的是JIRA的安装目录
如何添加自定义环境变量呢?
这里参考的是 如何在 Linux 中设置环境变量 {分步指南} (phoenixnap.com)
添加自定义变量
自定义变量可以放在 /etc/profile.d下,/etc/profile将会呼叫/etc/profile.d/*.sh,也就是只要/etc/profile.d下有sh脚本,且用户有读权限,且该脚本已经生效,就会被加载到环境变量。
将环境标量放到/etc/profile.d下
vim /etc/profile.d/0_custom-env.sh
export JIRA_HOME=/var/atlassian/application-data/jira
在重启的时候会对所有用户生效,如果没有重启,可以使用source命令加载环境变量
source /etc/profile.d/0_custom-env.sh
查看环境变量
要查看所有变量可以使用
printenv
对单个变量我们可以使用
printenv | grep 环境变量名称
例如我们需要查看刚刚添加的JIRA_HOME这个环境变量
printenv | grep JIRA_HOME
JIRA_HOME=/var/atlassian/application-data/jira
取消环境变量
使用
unset [VARIABLE_NAME]
创建一个备份专用账号
创建账号并赋予select权限
(关于创建账号更详细的内容请见Mysql 8.0创建用户并授权_Rocket MAN的博客-CSDN博客_mysql8创建用户并授权)
CREATE USER 'jira-dump'@'%' IDENTIFIED BY 'PASSWORD';
GRANT SELECT ON *.* TO 'jira-dump'IDEN;
使用该账号备份文件
mysqldump -hIP -ujira-dump -pPASSWORD jira countcurrentdateissues countversiontotestandreleaseissues --single-transaction >'/root/01-mysql-custom-table-backup/custom_table.sql'
如何修复mysql转储进程权限错误 - 另一杯咖啡 (anothercoffee.net)
报错一: you need (at least one of) the PROCESS privilege(s) for this operation
mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
关于访问 mysql 转储被拒绝 PROCESS 权限错误:
mysqldump访问 FILES 表中的表空间信息。在 MySQL 5.7.31 和 8.0.21 之前,您的用户可以在没有 PROCESS 权限的情况下运行。但是,在更新后运行的用户需要 PROCESS 权限才能访问INFORMATION_SCHEMA。文件表。在没有 PROCESS 权限的情况下运行最终会给您一个访问被拒绝的错误。mysqldumpmysqldumpmysqldump
mysqldump 至少需要对转储表具有 SELECT 权限,对于转储视图需要显示视图,对于转储触发器需要触发器,如果未使用 --single-transaction 选项,则需要 LOCK TABLES,以及(从 MySQL 8.0.21 开始)如果未使用 --no-tablespaces 选项,则需要 PROCESS。某些选项可能需要其他权限,如选项说明中所述。
解决方法一:加上--no-tablespaces
mysqldump -hIP -ujira-dump -pPASSWORD jira countcurrentdateissues countversiontotestandreleaseissues --single-transaction --no-tablespaces >'/root/01-mysql-custom-table-backup/custom_table.sql'
解决方法二:增加process权限
GRANT PROCESS ON *.* TO user;
注意:
根据 MySQL 文档,PROCESS 权限控制对会话正在执行的语句信息的访问。
它是服务器管理权限,不应授予所有用户。这是因为它可能会显示当前正在执行的查询中的文本。因此,任何具有 PROCESS 权限的用户都可能看到其他人发出的查询。危险在于:这些查询(如 )可能会显示机密。详细内容,请看https://anothercoffee.net/how-to-fix-the-mysqldump-access-denied-process-privilege-error/
报错二:Authentication plugin 'caching_sha2_password' cannot be loaded
mysqldump -hIP -ujira-dump -pPASSWORD jira countcurrentdateissues countversiontotestandreleaseissues --single-transaction --no-tablespaces >'/root/01-mysql-custom-table-backup/custom_table.sql'
mysqldump: Got error: 2059: "Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory" when trying to connect
MySQL 8.0 调整了账号认证方式,把 caching_sha2_password 插件认证方式作为默认首选,这就导致很多需要使用密码登录的客户端,远程登录 MySQL 时报错
解决方法:
解决 MySQL 中 caching_sha2_password 连接报错和认证方式改为 mysql_native_password 的方法 - 卡拉云 (kalacloud.com)
ALTER USER 'jira-dump'@'%' IDENTIFIED WITH mysql_native_password ;
当然,也可以在创建用户前,就指定
CREATE USER 'jira-dump'@'%' IDENTIFIED WITH mysql_native_password BY 'PASSWORD';
FLUSH PRIVILEGES;
备份数据库命令
备份某个数据库
mysqldump database_name > database_name.sql
备份某个表
mysqldump database_name table_name > table_name.sql
备份所有数据库
mysqldump -uroot -p –all-databases > all_databases.sql
备份多个表
mysqldump -uroot -p database_name table_name1 table_name2 --single-transaction >table_name.sql
解压sql语句到日期格式目录
zip "$(date +"%Y-%b-%d--%H%M")"--custom-table.zip custom_table.sql
关于Linux日期格式化请参考:
Linux 中的 Date 命令:如何设置、更改、格式化和显示日期 (phoenixnap.com)
其中月份的英文缩写比如‘Mar’可以用‘%b’来表示、
添加到定时任务
添加脚本到定时执行
sudo crontab -e
00 08 * * * BASH_ENV=/etc/profile /root/01-mysql-custom-table-backup/backup-custome-table.sh
定时执行增加环境变量
由于cron 是从非交互式、非登录 shell 运行jobs的,所以crontab中不能运行有环境变量的脚本,下面介绍几种添加环境变量脚本的方式
1、在crontab中添加单个环境变量脚本
crontab -e
* * * * * BASH_ENV=/etc/profile /root/01-mysql-custom-table-backup/backup-custome-table.sh
注:/etc/profile将会自动执行自定义脚本/etc/profile.d/0_custom-env.sh,上面的命令不需要单独写BASH_ENV=/etc/profile.d/0_custom-env.sh
2、如果需要加载多个环境变量脚本,那么可以编写自定义脚本,引入多个环境变量脚本,然后在crontab中加载该脚本
vim /root/01-mysql-custom-table-backup/preload.sh
#!/bin/bash
. /etc/profile
. ~/.bash_profile
. ~/.bashrc
* * * * *BASH_ENV=/etc/profile /root/01-mysql-custom-table-backup/backup-custome-table.sh
注:/etc/profile将会自动执行自定义脚本/etc/profile.d/0_custom-env.sh,上面的/root/01-mysql-custom-table-backup/preload.sh中不需要单独加上BASH_ENV=/etc/profile.d/0_custom-env.sh
3.如果我们直接在cron中执行命令,那么需要用bash包装这个命令
* * * * * BASH_ENV=/etc/profile bash -c "printenv > /tmp/print_envs_result"
注:/etc/profile将会自动执行自定义脚本/etc/profile.d/0_custom-env.sh,上面的命令不需要单独写BASH_ENV=/etc/profile.d/0_custom-env.sh
关于更多,请查看如何在 Cron 作业|中加载环境变量Baeldung on Linux
备份脚本
mkdir /root/01-mysql-custom-table-backup
vim /root/01-mysql-custom-table-backup/backup-custome-table.sh
#!/bin/bash
mysqldump -hIP -ujira-dump -pPASSWORD jira countcurrentdateissues countversiontotestandreleaseissues --single-transaction --no-tablespaces>'/root/01-mysql-custom-table-backup/custom_table.sql'
zip $JIRA_HOME/export/"$(date +"%Y-%b-%d--%H%M")"--custom-table.zip '/root/01-mysql-custom-table-backup/custom_table.sql'
rm -f custom_table.sql
脚本需要变成可执行文件,增加+x权限
chmod +x backup-custome-table.sh
恢复数据库
恢复数据库命令
mysql -hIP -uLUSERNAME -Ddatabase -p < table_name.sql
sh脚本提示用户输入信息
read x
x是变量,变量可以通过$x赋值到其他地方
read -p "Enter Your Name: " x
-p,使用该选项在输入之前使用read命令打印消息
read -s -p "Enter a Password: " x
-s表示静默模式,在屏幕上隐藏输入字符,我们可以通过该选项输入密码
shell脚本使用if..else..
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
注意,if后面 '[' 后面和 ‘]’ 前面需要有空格,否则报错
判断访问的路径和文件是否是路径或文件
判断文件夹是否存在
#如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
mkdir /myfolder
fi
判断文件是否存在
# -f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
touch "$file"
fi
其他判断类型请参考
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
恢复数据库脚本如下
vim /root/01-mysql-custom-table-backup/restore-custom-table.sh
#!/bin/bash
echo '请输入压缩文件名称:'
read custom_table_file_name1
echo '请再次确认压缩文件名称:'
read custom_table_file_name2
#两次如果不是同一个文件,不解压
if [ $custom_table_file_name1 == $custom_table_file_name2 ]
then
echo $JIRA_HOME/export/$custom_talbe_file_name1
#如果输入的不是文件,不解压
if [ ! -f $custom_talbe_file_name1 ]
then
echo '被解压的不是一个文件!'
else
unzip $JIRA_HOME/export/$custom_table_file_name1
echo '请输入需恢复数据的服务器 Mysql密码:'
mysql -hIP -uroot -Djira -p < custom_table.sql
rm -r custom_table.sql
fi
else
echo '目录不一致!'
fi
参考
用于备份 MySQL 数据库表“结构和数据”的命令 (how2shout.com)
MySQL日期格式化(format)-%Y-%m-%d %H:%i:%S_ Java 攻城狮 的博客-CSDN博客
MySQL Automated Backup on Linux |知识库 (msp360.com)
如何在Linux/Ubuntu上的MySQL/MariaDB中运行SQL文件 (linuxscrew.com)
在 Linux 中创建以当前日期/时间/月/年命名的目录 (ostechnix.com)
如何在 Linux 中设置环境变量 {分步指南} (phoenixnap.com)
如何在Linux shell脚本中提示用户输入 - TecAdmin
Shell判断文件或目录是否存在_Bruce小鬼的博客-CSDN博客_shell判断文件是否存在
如何修复mysql转储进程权限错误 - 另一杯咖啡 (anothercoffee.net)
解决 MySQL 中 caching_sha2_password 连接报错和认证方式改为 mysql_native_password 的方法 - 卡拉云 (kalacloud.com)