Linux上创建备份和恢复数据库&表格的脚本

12 篇文章 0 订阅
本文详述了在Linux系统中如何备份和恢复MySQL数据库,包括设置环境变量、创建备份用户、处理权限问题,以及使用mysqldump进行备份和恢复的命令。此外,还介绍了如何通过cron定时任务实现自动备份,并提供了相关的shell脚本示例。
摘要由CSDN通过智能技术生成

备份数据库

添加目录路径到环境变量(非必要步骤,可跳过)

我们的脚本中使用到了$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

其他判断类型请参考

  1. -e filename 如果 filename存在,则为真

  2. -d filename 如果 filename为目录,则为真

  3. -f filename 如果 filename为常规文件,则为真

  4. -L filename 如果 filename为符号链接,则为真

  5. -r filename 如果 filename可读,则为真

  6. -w filename 如果 filename可写,则为真

  7. -x filename 如果 filename可执行,则为真

  8. -s filename 如果文件长度不为0,则为真

  9. -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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值