ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 数据库备份 >[success]在这里咱们只介绍一下单数据库的备分 ### 数据库备份的方法 ------------------------------数据库备份:------------------------------------ 使用命令:mysqldump 格式为: ~~~ #备份指定数据库 mysqldump -u[用户名] -p[密码] 数据库 >备份文件.sql #备份压缩 mysqldump -u[用户名] -p[密码] 数据库 |gzip>备份文件.sql ~~~ 但是在使用过程中会提示: ~~~ Warning: Using apassword on the command line interface can be insecure. ~~~ 意思是说:在命令行中输入密码 不安全 在命令行输入密码,就会提示这些安全警告信息; 【解决办法】 把账号密码写入配置文件即可 `vim /etc/my.cnf` ~~~ [mysqldump] user=your_backup_user_name password=your_backup_password ~~~ 修改完配置文件后, 只需要执行mysqldump 脚本就可以了;备份脚本中不需要涉及用户名密码相关信息; ~~~ mysqldump ys_yangsheng > test1.sql ~~~ 在备份时,可以对文件进行压缩 ### 数据库备份脚本的案例: ~~~ #!/bin/bash #mySQL数据库备份 #author yifeng (Email:576617109@qq.com) ntpdate asia.pool.ntp.org &>/dev/null #同步系统时间 date=$(date +%Y%m%d%H%M%S) month=$(date +%Y%m) mkdir /mnt/beifen/zhixiao &>/dev/null mkdir /mnt/beifen/zhixiao/mysql &>/dev/null if [ -d /mnt/beifen/backup ] then cd /mnt/beifen/backup mysqldump ys_yangsheng >zhixiao.sql else mkdir /mnt/beifen/backup cd /mnt/beifen/backup mysqldump ys_yangsheng >zhixiao.sql fi cd /mnt/beifen/zhixiao/mysql if [ -d $month ] then cd $month tar -zcf mysql_$date.tar.gz /mnt/beifen/backup/zhixiao.sql &>/dev/null else mkdir $month cd $month tar -zcf mysql_$date.tar.gz /mnt/beifen/backup/zhixiao.sql &>/dev/null fi rm -f /mnt/beifen/backup/zhixiao.sql cd / #返回根目录,不然下次执行时可能会报错,一般是当前目录被删除的情况下 ~~~ #### [写脚本的注意事项:] >[danger]1、if 语句中 的中括号的两边要有空格 2、带有变量的语句,特别是目录,最好是分开来写 3、执行脚本时,当在所在目录要存在 例:如当前目录 /test/test1 在脚本中,有一句是删除test1 那么这时执行脚本可能就会报错。 #### [遇到的问题] ~~~ #同步系统时间 ntpdate asia.pool.ntp.org ~~~ >[success]在执行下面一条命令同步系统时间时,出现如下提示: ![](https://box.kancloud.cn/45869157e12152573635a1ee37c9f871_1194x105.png) >[danger]原因:是因为咱们设置的有防火墙,并且只开了,22、80 端口。 在这里咱们需要开启53端口和123端口。 53端口介绍 服务:Domain Name Server(DNS) 说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS(UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。 #### 所以在这里临时开启一下53端口即可。 ~~~ iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT iptables -A INPUT -p tcp --sport 53 -j ACCEPT iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p UDP --dport 53 -j ACCEPT iptables -A OUTPUT -p UDP --sport 53 -j ACCEPT iptables -A INPUT -p UDP --sport 53 -j ACCEPT iptables -A OUTPUT -p UDP --dport 53 -j ACCEPT ~~~ #### 所以在这里临时开启一下123端口即可。 ~~~ iptables -A INPUT -p UDP --dport 123 -j ACCEPT iptables -A OUTPUT -p UDP --sport 123 -j ACCEPT ~~~ #### 通过上面的设置之后,再次执行: ~~~ ntpdate asia.pool.ntp.org ~~~ ![](https://box.kancloud.cn/fba2821061b45d0777e590cec90e9865_1339x75.png) ### 知识扩展-备份所有数据库 在这里主要介绍一下,备份的思路! ### 备份要求 #### 1. 备份所有数据库 #### 2. 备份后需要压缩成tar.gz的格式 #### 3. 备份的名称需要和数据库同名 #### 4. 同一次备份放在以时间串命名的目录中 ### 知识点分析 #### 难点1. 数据库名的获取 >[info]如何获取所有的数据库名称 要想获取全部的数据库名称可以使用,show databases,前提需要先登录数据库。 在脚本同的实现方式: ~~~ #! /bin/bash da=`/usr/local/mysql/bin/mysql -uroot -p111111 <<EOF show databases; EOF` #输出结果 Database information_schema mysql performance_schema sys ~~~ #### 难点2.循环备份数据库 >[success]在这里要注意,第一个Dababase这个是不需要备份的,可以在循环前将其去除,也可以备份时做一次判断跳过备份。 用到的循环语句 ~~~ for dataname in $da #dataname 前不能加$ do #执行备份,数据库名为$dataname done ~~~ #### 最终的脚本 在这里咱们直接备份mysql自带的数据库 ~~~ #!/bin/bash # 获取数据库列表 datalist=`/usr/local/mysql/bin/mysql -uroot -p111111<<EOF show databases; EOF` #创建当前备份目录 dirname=$(date +%Y%m%d%H%M%S) mkdir /backup/$dirname for dataname in $datalist do if [ $dataname != 'Database' ] then #备份文件放到/backup /usr/local/mysql/bin/mysqldump $dataname --single-transaction>/tmp/$dataname.sql cd /tmp tar -czf /backup/$dirname/$dataname.tar.gz ./$dataname.sql>/dev/null rm -f /tmp/$dataname.sql fi done cd / ~~~ ### 遇到的问题 在这所说的备份都是mysqldump 执行上面的脚本备份数据库时如下错误: ![](https://box.kancloud.cn/c91121d54c06197b82739e1a17b9f279_609x41.png) >[danger]出现这个问题的原因,是因为咱们获取到的数据库表中,第一个Database这个并不是一个真正的数据库,而是咱们通过show databases;时,出现的个数名称。这个数据库实际是不存在的,所以对其进行备份会出错。 但是在脚本中,咱们已经执行了如下命令,将其排除,目前的报错,说明脚本中并没有排除成功。排除的代码如下: ~~~ #排除Database,这个无效数据库 if [ $dataname!='Database' ] then #备份文件放到/backup /usr/local/mysql/bin/mysqldump $dataname --single-transaction>/tmp/$dataname.sql cd /tmp tar -czf /backup/$dirname/$dataname.tar.gz ./$dataname.sql>/dev/null rm -f /tmp/$dataname.sql fi ~~~ >[success]只所以没有排除成功,是因为if [ $dataname!='Database' ]。在这里大家一定要注意: if语句的使用注意事项: #### 空格不能少 `if 空格[空格$dataname空格!=空格'Database'空格] 这里面的空格是不能少的。` #### 命令不能少 ~~~ if command then command #不能少 else command fi ~~~ ### 2. tar: 从成员名中删除开头的“/” >[info]出一这个问题,是因为在使用在tar命令时,要打包的文件需要是相对路径,如果是绝对路径就出报这个提示,但是是可以正常打包成功的。 解决办法有两个: #### 1. 加入 -P 参数 #### 2. 使用相对路径(推荐) #### 3. 在执行数据库备份时可能会出现如下问题: `/usr/local/mysql/bin/mysqldump $dataname >/tmp/$d ataname.sql` 执行以上数据库备份命令会报如下错误: ![](https://box.kancloud.cn/5a127a1e0f2908be16ff6b7d2c093364_1208x135.png) 解决办法:加入参数--single-transaction ~~~ /usr/local/mysql/bin/mysqldump $dataname --single-transaction>/tmp/$d ataname.sql ~~~ ### 4. 备份时出现如下错误: ![](https://box.kancloud.cn/e99a0d77d852101682c0d1e2ed2caff7_1202x105.png) 出在这个问题的原因: >[danger]从mysql5.7.6开始information_schema.global_status已经开始被舍弃,为了兼容性,此时需要打开 show_compatibility_56 把show_compatibility_56打开: ~~~ mysql> set global show_compatibility_56=on; Query OK, 0 rows affected (0.00 sec) ~~~