> 数据库 > MySQL >

Centos7 实现MySQL局域网备份

  数据备份操作是非常重要的一步,针对上线系统来说,没有备份的数据库是不安全的。本博文通过查阅网上资料,实现了MySQL数据库通过shell脚本文件的全备份,增量备份和局域网内定时备份操作。

 

     服务器介绍:centos 7.0

 

     【本地全备份】

      

      1. 单数据库备份脚本文件

     

       #vi mysql-backup.sh

  

 

[sql] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. db_user="root"     #本服务器用户名密码  
  2. db_passwd="root"    
  3. db_host="192.168.64.137"   #本服务器地址  
  4. db_name="whp"  #需要备份数据库名称  
  5. # the directory for story your backup file.    
  6. backup_dir="/backup"    #备份以后放入的文件路径  
  7. date format for backup file (dd-mm-yyyy)    
  8. time="$(date +"%Y-%m-%d-%H-%M-%S")"    
  9. # mysql, mysqldump and some other bin's path    
  10. MYSQL="/application/mysql/bin/mysql"    
  11. MYSQLDUMP="/application/mysql/bin/mysqldump"    
  12. GZIP="/bin/gzip"    
  13.     
  14. $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db_name | $GZIP -9 > "$backup_dir/$db_name"_"$time.gz"  

 

          2. 保留7天历史数据的全备份

 

[sql] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. db_user="root"    
  2. db_passwd="root"    
  3. db_host="localhost"     
  4. # the directory for story your backup file.    
  5. backup_dir="/application/backup/"    
  6. date format for backup file (dd-mm-yyyy)    
  7. time="$(date +"%H-%M-%S-%m-%d-%y")"    
  8. # mysql, mysqldump and some other bin's path    
  9. MYSQL="/application/mysql/bin/mysql"    
  10. MYSQLDUMP="/application/mysql/bin/mysqldump"    
  11. MKDIR="/bin/mkdir"    
  12. RM="/bin/rm"    
  13. MV="/bin/mv"    
  14. GZIP="/bin/gzip"    
  15. check the directory for store backup is writeable     
  16. test ! -w $backup_dir && echo "Error: $backup_dir is un-writeable." && exit   
  17. # the directory for story the newest backup    
  18. test ! -d "$backup_dir/backup.0/" && $MKDIR "$backup_dir/backup.0/"    
  19. echo "Start to Backup...";    
  20. # get all databases    
  21. # don't backup information_schema、performance_schema    
  22. all_db="$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse 'show databases')"    
  23. all_db=${all_db//information_schema/};    
  24. all_db=${all_db//performance_schema/};    
  25. for db in $all_db    
  26. do    
  27. $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > "$backup_dir/backup.0/$time.$db.gz"    
  28. done    
  29. delete the oldest backup    
  30. test -d "$backup_dir/backup.7/" && $RM -rf "$backup_dir/backup.7"    
  31. # rotate backup directory    
  32. for int in 6 5 4 3 2 1 0    
  33. do    
  34. if(test -d "$backup_dir"/backup."$int")    
  35. then    
  36. next_int=`expr $int + 1`    
  37. $MV "$backup_dir"/backup."$int" "$backup_dir"/backup."$next_int"    
  38. fi    
  39. done    
  40. echo "BackUp Success!"    
  41. exit 0;    

 

          3. 修改shell脚本权限并执行

 

 

           # chmod 700 mysql-backup.sh  // 只允许管理员运行此脚本

           #./mysql-backup.sh                //执行脚本,测试一次

 

   【日志文件增量备份】

 

     1.  建立脚本文件:

      #vi incre-backup.sh

 

[sql] view plain copy 
 
 在CODE上查看代码片派生到我的代码片
  1. #执行mysqladmin执行刷新日志文件           
  2. /application/mysql/bin/mysqladmin -uroot -proot flush-logs     
  3.            
  4. #DATADIR=/var/lib/mysql     
  5. DATADIR=/application/data  #获取数据文件路径   
  6. BAKDIR=/backup    #获取要备份的数据目标文件路径  
  7.            
  8. ###如果mysql bin log你做了特殊设置,请修改此处或者修改应用此变量的行:缺省取机器名,mysql缺省也是取机器名     
  9. #HOSTNAME=`uname -n`     
  10. cd $DATADIR   #转入到/application/data 查询mysql-bin.index文件  
  11. #FILELIST=`cat $HOSTNAME-bin.index`     
  12.  FILELIST=`cat mysql-bin.index`     
  13.    
  14. ## COUNTER number     
  15. COUNTER=0     
  16. for file in $FILELIST     
  17. do     
  18. COUNTER=`expr $COUNTER + 1 `     
  19. done     
  20.            
  21. NextNum=0     
  22. for file in  $FILELIST     
  23. do     
  24. base=`basename $file`     
  25. NextNum=`expr $NextNum + 1`     
  26. if [ $NextNum -eq $COUNTER ]     
  27. then  
  28. echo "skip lastest"  
  29. else  
  30. dest=$BAKDIR/$base     
  31. if(test -e $dest)     
  32. then  
  33. echo "skip exist $base"  
  34. else  
  35. echo "copying $base"  
  36. cp $base $BAKDIR     
  37. fi     
  38. fi     
  39. done     
  40.            
  41. echo "backup mysql binlog ok"  

 

             2. 修改文件权限并执行

 

              # chmod 700 incre-backup.sh  // 只允许管理员运行此脚本

              #./mysql-backup.sh                //执行脚本,测试一次

 

         【自动备份】

 

           自动备份是站在以上编写脚本的基础上,利用linux系统crontab命令,定时自动执行shell文件:

 

 

           # crontab –e

           添加:

           00 01 * * */mysql-backup.sh    // 每天凌晨1点执行

 

     【远程局域网备份】

 

      局域网备份利用NFS服务器实现数据在局域网共享的方式实现备份,利用在NFS服务器挂载的方式实现,就像我们平时共享文件,通过配置网络连接,让自己的文件得到共享。实现方式如下:

 

          1. NFS服务器端安装

 

 

          a)安装 NFS 服务器所需的软件包:

          # yuminstall -y nfs-utils

 

           b)编辑exports文件

           #vim/etc/exports

           #/home/nfs/192.168.248.0/24(rw,sync) 

 

     同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中

rw表示可读写;sync表示同步写

 

           c)启动nfs服务

           #systemctlstart rpcbind.service

           #systemctlstart nfs-server.service

 

           d)确认NFS服务器启动成功:

           #rpcinfo –p

 

           e)若没有启动成功,重新启动rpcbind和nfs-server服务:

           #systemctl restart rpcbind.service

           #systemctl restart nfs-server.service

 

           客户端安装

 

            a)安装nfs,启动rpcbind服务

            # yuminstall -y nfs-utils

 

            b)先为rpcbind做开机启动

            #systemctlenable rpcbind.service

 

            c)然后启动rpcbind服务:

            systemctlstart rpcbind.service

 

            d)检查NFS服务器端是否有共享目录:

            #showmount -e 192.168.64.138

 

            e)在从机上使用mount挂载服务器端目录到客户端某个目录下(这里将上面本地备份的文件路径挂载如服务器里面):

             #mount -tnfs -o nolock,nfsvers=1,vers=3 192.168.64.138:/home/nfs /backup

 

         问题:mount.nfs: Stale NFS file handle

         解决方法:在client端把挂载文档去掉重新挂载:

         # umount –a

 

    【备份恢复】

 

 

      a.将gzip数据库恢复到Mysq

       #gunzip <dbname.gz | mysql -u Username -p dbname

 

      b.二进制文件恢复数据库:

       #/mysql/bin/mysqlbinlog--database=fox --start-date="2013-01-22 5:00:00"  --stop-date="2013-01-22 9:00:00"/mysql/data/mysql-bin.000001 | /mysql/bin/mysql -u root -p123456 –f

 

      database:指定具体的数据库

      start-date:开始时间

      stop-date:结束时间

      /mysql/data/mysql-bin.000001:指定二进制文件

 

   【总结】

 

    基本的备份方法已经完成,但是我们要根据具体的应用场景采用不同的备份策略,保证安全的前提下又不消耗过多内存。




(责任编辑:IT)