Linux下mysql数据库自动定时备份

时间:2022-05-02 10:26:39

对于网游来说,数据库中的数据尤其重要,实际运营中通常会有DBA或者运维人员对数据库中数据进行日常备份,防止服务器宕机或硬盘损坏导致的数据丢失问题

1.创建备份目录


cd /home/game
mkdir backup
cd backup

2.创建备份shell脚本


vi bkDatabaseName.sh
将以下内容复制粘贴
#!/bin/bash
#!/bin/bashmysqldump -uusername -ppassword DatabaseName > /home/game/backup/DatabaseName_$(date +%Y%m%d_%H%M%S).sql


把username 替换为实际的用户名
把password 替换为实际的密码
把DatabaseName 替换为实际的数据库名

3.添加可执行权限


chmod u+x bkDatabaseName.sh


添加可执行权限之后先执行一下,看看脚本有没有错误,能不能正常使用


./bkDatabaseName.sh

4.添加计划任务


检测或安装crontab

执行以下命令看是否安装有crontab
crontab
如果错“command not found”,则表明没安装;如果没安装,先安装,参照以下博客
CentOS下使用yum命令安装计划任务程序crontab
使用rpm命令从CentOS系统盘安装计划任务程序crontab

添加计划任务

crontab -e
输入以下内容并保存

*/1 * * * * /home/backup/bkDatabaseName.sh

意思是每隔一分钟执行一次bkDatabaseName.sh,crontab格式参照以下博客


Crontab使用语法格式

5.测试计划任务是否执行


执行几次“ll”命令看下是否有文件创建就知道了。如果任务执行失败,看以下日志

tail -f /var/log/cron

输出大概是这样的:
Nov 23 18:00:01 app CROND[31215]: (mysql) CMD (/home/mysql/.wipefs)
Nov 23 18:00:01 app crontab[31219]: (mysql) LIST (mysql)
Nov 23 18:01:01 app CROND[31388]: (root) CMD (run-parts /etc/cron.hourly)
Nov 23 18:01:01 app run-parts(/etc/cron.hourly)[31388]: starting 0anacron
Nov 23 18:01:01 app run-parts(/etc/cron.hourly)[31397]: finished 0anacron
Nov 23 18:02:01 app CROND[31549]: (root) CMD (/home/game/backup/bkdd5.sh)

6.备份数据库到远程主机


scp d4tool_$(date +%Y%m%d_%H%M%S).sql root@72.191.254.261:/home/backup 

意思是将本地文件复制到261这个主机的backup目录下,scp命令参考如下博客
scp命令

这样每次用scp命令的时候都需要输入261的登陆密码,很不方便,需要免密输入

7.scp无需输密码传送文件


两种方法:1.配对秘钥 2.用expect脚本

配对秘钥

在源主机A上用如下命令生成配对秘钥:
[root@app ~]# ssh-keygen -t rsa 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e2:9e:98:7a:36:62:bc:d8:d1:b3:3c:fe:f8:4e:fd:9c root@app.web.140.242.189.217.com
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|      . S        |
|   . . o         |
| .. o o .        |
| o+o=O . o .     |
|..+BB**   E      |
+-----------------+
直接enter就好,生成的rsa跟pub文件都放在默认的/root/.ssh目录下。将pub文件拷贝到目标主机B上的/root/.ssh/authorized_keys中(如果没有则创建一个),
scp id_rsa.pub root@427.931.244.211:/root/.ssh/authorized_keys 
这样就ok了

用expect脚本


#!/usr/bin/expect  
set timeout 10  
set host [lindex $argv 0]  
set username [lindex $argv 1]  
set password [lindex $argv 2]  
set src_file [lindex $argv 3]  
set dest_file [lindex $argv 4]  
spawn scp $src_file $username@$host:$dest_file  
 expect {  
 "(yes/no)?"  
  {  
    send "yes\n"  
    expect "*assword:" { send "$password\n"}  
  }  
 "*assword:"  
  {  
    send "$password\n"  
  }  
}  
expect "100%"  
expect eof 

注意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。

从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:


./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file  

以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.75.130中的/root下,同时还将这个源文件重命名为dest_file
spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止
使用expect需要了解的一点是:用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行,没有ssh密钥登录的快速