Ubuntu14.04下设置mysql自动备份多种方法

jerry ubuntu 2018年01月30日 收藏

第一种:


1、创建保存备份文件的路径/mysqldata

#mkdir /mysqldata


2、创建/usr/sbin/bakmysql文件

#nano /usr/sbin/bakmysql

输入:

#!/bin/sh
name=`date +%Y%m%d`
mysqldump shujuku -uroot -p123456 >/home/data/mysql$name.sql

完整版:

删除3天的mysql备份文件示例如下

DATABASE=/home/data/mysql #文件备份路径
DATE=`date '+%Y%m%d-%H%M'` #日期格式(作为文件名)
DUMPFILE=$DATABASE-$DATE.sql #备份文件名
DATE_N=`date -d "-3 day" +%Y%m%d`
#删除N天前的备份文件 
rm -rf $DATABASE-$DATE_N*
#备份数据
mysqldump dbname -uroot -p123456 >$DUMPFILE
#压缩文件
tar zcvf /home/data/$DATE.tar.gz $DUMPFILE
#删除sql文件sql
rm -rf $DUMPFILE

注:--all-databases 为备份全部数据库到mysqlbak下的mysql.sql文件中,如果把--all-databases替换为test,则只备份test数据库。

3、修改文件属性,使其可执行

# chmod +x /usr/sbin/bakmysql


4、修改/etc/crontab

#vi/etc/crontab

在下面添加:

01 3 * * * root /usr/sbin/bakmysql

表示每天3点钟执行备份。

5、重新启动crond

# /etc/init.d/crond restart

完成。

第二种:

1.创建一个文件夹,用来放你备份的文件。

地址可以你定,下面是我的方式

#mkdir /home/ubuntu/data_backup


注:下文这种颜色的表示在命令行中输入的~

2.创建备份程序

#vi /usr/sbin/bakmysql

注:表示使用nano编辑器(nano是一个比vi简单一些的文本剪辑器。),在/usr/sbin/目录下创建名为bakmysql的文件

进入编辑器后,输入:

rq=`date +%Y%m%d`
mysqldump --all-databases -u root -p密码 >/home/ubuntu/data_backup/mysql$rq.sql


怎么退出nano?编辑界面下面有提示,看不懂?^+O是啥意思?^就是Ctrl,表示按Ctrl+O,写入文件,然后按回车,让你确定路径和文件名,回车就是了。然后Ctrl+X,退出。其它用法自行参考nano用法。

注:第一行是定义一个变量rq(日期),注意标点符号是`(英文状态下按Esc下面那个键)不是',然后取了系统的date中的年Y月m日d,date和+号之间有空格。

第二行,使用mysqldump命令(mysql自带)来备份数据库;参数 --all-databases是指备份所有数据库,如果只想备份某个数据库,替换为该数据库的名字即可(不用加-);-u后面输入空格和数据库的用户名root(确保有权限);-p后面不带空格,输入密码;>表示重定向,后面的参数表示文件存放的地址和文件名,其中$rq表示引用第一行的变量rq,这样备份出来的文件就是"mysql20141201.sql"这样子。

3.为备份程序添加权限:

直接使用暴力的:

#chmod 777 /usr/sbin/bakmysql


本来使用chmod +x 就可以的,表示+(添加)x(执行)的权限,这样会安全一些,但是如果你的可能使用其它用户来执行可能会出现permission denied的情况,所以直接暴力777了,你懂的。

4.测试这个备份程序
不用我告诉你这么执行这个文件了吧o(╯□╰)o,执行完看data_backup文件夹下有没有那个sql文件,就对了。
步骤二:

1.修改/etc/crontab

#nano -w /etc/crontab

注:-w表示不使用自动换行,这个在修改系统文件时必须加上,避免出现问题,在这里可以加可以不加,安全起见还是我是加了~

在下面添加

30 3 * * * root /usr/sbin/bakmysql

注:表示每天3点30分以root用户执行/usr/sbin/bakmysql

2.重启crontab

# /etc/init.d/crond restart

出错处理:如果执行2出现提示:

 cron: can’t lock /var/run/crond.pid, otherpid may be 2699: Resource temporarily unavailable

解决办法:

 rm -rf /var/run/crond.pid

然后再执行1。

第三种:

1.cron介绍

cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。有一个叫做crontab的命令允许用户提交、编辑或删除相应的作业。下面是crontab的格式:
分< >时< >日< >月< >星期< >要运行的命令

crontab命令的一般形式为:

crontab[-u user] -e -l -r

其中:

-u 用户名。 
-e 编辑crontab文件。 
-l 列出crontab文件中的内容。 
-r 删除crontab文件。 
2.mysqldump介绍 
--add-drop-table 
这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除。 
--add-locks 
这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作 
-c 
这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。 
--delayed-insert 
在INSERT命令中加入DELAY选项 
-F 
使用这个选项,在执行导出之前将会刷新MySQL服务器的log. 
-f 
使用这个选项,即使有错误发生,仍然继续导出 
-l 
使用这个选项,导出表的时候服务器将会给表加锁。 
-t 
这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。 
-d 
这个选项使的mysqldump命令不创建INSERT语句。 
--opt 
此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。 
-q 
这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。 
-T path 
这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命 名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。 
-w "WHERE Clause" or -where = "Where clause " 
使用这一选项来过筛选将要放到 导出文件的数据


3.进行备份

建立备份文件夹 /mysqlbak

在 /usr/sbin 文件下建立bakmysql脚本

#!/bin/sh 
name=$(date +%Y-%m-%d) 
mysqldump database  -ubackup -p123456 |gzip>/mysqldata/mysql$name.gz


在ubuntu下下可以选择两种任务方案
第一:
查看 /etc/crontab 文件

# m h dom mon dow user  command 
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly 
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) 
#


第一个是指每天0点17分执行/etc/cron.hourly下的所有任务,后面的都类似。

m   分钟 
h   小时 
dom   即day of month吧,就是日期 
mon   即month,月份 
dow   即day of week 星期 
run-parts 是执行后面指定的目录下的任务,不指定这个参数则为执行单个指定的文件。

根据这些我们就可以很轻松的进行任务,直接把我们的脚本根据自己的需求放入到其中的文件夹中即可。

第二:
1.crontab -e 编辑增加任务。

0 0 * * * /usr/sbin/bakmysql


表示在每天的0点0分执行/usr/sbin/bakmysql脚本。
2.crontab -l 查看我们的任务。
3.重启crond。

/etc/init.d/crond restart

第四种:

利用系统crontab来定时执行备份文档,按日期对备份结果进行保存,达到备份的目的。
1、创建保存备份文档的路径/var/mysqldata
#mkdir /var/mysqldata

2、创建/usr/sbin/bakmysql文档
#nano /usr/sbin/bakmysql

输入

rq=`date +%Y%m%d` 
tar zcvf /var/mysqldata/mysql$rq.tar.gz /var/lib/mysql

注意date前和后边的那个是`,不要写成'
或写成

rq=`date +%Y%m%d` 
mysqldump --all-databases -u root -p密码 > /var/mysqldata/mysql$rq.tar.gz
/var/lib/mysql是您数据库文档的目录,部分用户是/usr/local/mysql/data,每个人可能不同 
/var/mysqldata/表示保存备份文档的目录,这个每个人也能够根据自己的需要来做。

注:--all-databases 为备份全部数据库到mysqlbak下的mysql$rq.tar.gz文件中,如果把--all-databases替换为test,则只备份test数据库。

3、修改文档属性,使其可执行

# chmod +x /usr/sbin/bakmysql


4、修改/etc/crontab

#nano /etc/crontab


在下面添加

01 3 * * * root /usr/sbin/bakmysql

表示每天3点钟执行备份

5、重新启动crond

# /etc/init.d/crond restart

完成。
这样每天您在/var/mysqldata能够看到这样的文档

mysql20110408.tar.gz

您直接下载就能够了。
在tar命令执行前,停止数据库服务进程或锁定数据库, .
否则恢复数据时,会出现数据库损坏的情形,运气好时可修复,运气不好时就不能够了。 ..
所以建议
编辑 /usr/sbin/bakmysql文档

#nano /usr/sbin/bakmysql
sudo /etc/init.d/mysql stop
sleep 20
sudo /etc/init.d/apache2 stop
sleep 20
rq=`date +%Y%m%d` 
tar zcvf /var/mysqldata/mysql$rq.tar.gz /var/lib/mysql
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start


这样,先停止数据库服务和Apache2的进程,再进行备份,比较稳妥。 sleep 20 是中间停留20秒

但是还有一个问题就是:一般用户在执行sudo命令时是要输入密码的,那么上述的执行过程中肯定不行住下执行。

解决办法就是 请看下一篇日志 Ubuntu中sudo免输密码的方法&激活root帐户

最后附上我的最终修改的四个文件内容:

sudo nano /etc/crontab //定时执行
01 03 * * * root /usr/sbin/bakmysql 
//这个文件是导出数据库的批处理 每天 凌晨3:01分执行
01 04 * * * root /usr/sbin/bakmysql_fz 
//这个文件是复制数据库的批处理 每天 凌晨4:01分执行
01 05 * * * root /usr/sbin/xkedu_del 
// 删除XX天前的那天的备份的批处理 每天 凌晨 5:01 执行
sudo nano /usr/sbin/bakmysql  //这个文件是导出数据库的批处理 每天 凌晨3:01分执行
sudo /etc/init.d/nginx stop //停止nginx 服务器
sleep 20 //停留20秒
mysql -u root -proot //进入数据库 用户名和密码都是 root 注意-p后边没有空格
FLUSH TABLES WITH READ LOCK //这个命令在网上查吧,主要是将文件写入硬盘 防止导出出错
/Q //这是退出数据库命令
rq=`date +%Y%m%d` //设置变量,获取今天的日期 格式:20110516
sudo mysqldump -u root -proot --all-databases > /var/mysqldata/mysql_$rq.sql //用数据库命令mysqldump导出所有库为一个sql文件,放在/var/mysqldata文件夹中,文件名为:mysql_+日期.sql
sleep 20 //停留20秒
tar zcvf /var/mysql_backup/mysql_$rq.tar.gz /var/mysqldata/mysql_$rq.sql //将上边的导出的sql文件压缩放在/var/mysql_backup/中,文件名为:mysql_+日期.tar.gz
sleep 20 //停留20秒
sudo /etc/init.d/nginx start //开始nginx 服务器
sudo nano /usr/sbin/bakmysql_fz  //这个文件是复制数据库的批处理 每天 凌晨4:01分执行
sudo /etc/init.d/mysql stop //停止数据库
sleep 20 //停留20秒
sudo /etc/init.d/nginx stop //停止nginx 服务器
sleep 20 //停留20秒
rq=`date +%Y%m%d` //设置变量,获取今天的日期 格式:20110516
tar zcvf /var/mysqldata/fz/mysql$rq.tar.gz /var/lib/mysql //将数据库文件夹/var/lib/mysql 压缩到 /var/mysqldata/fz文件下,文件名为:mysql+日期.tar.gz
sudo /etc/init.d/nginx start //开始nginx 服务器
sudo /etc/init.d/mysql start //开始数据库

2011.05.17 新增定期删除备份文件的功能

sudo nano /usr/sbin/xkedu_del  // 删除XX天前的那天的备份的批处理 每天 凌晨 5:01 执行
DATE=$(date +%Y%m%d) 
//获取今天的日期,结果为:20110517
aa_DATE=$(date "-d 7 day ago" +%Y%m%d) 
//获取7天前的那天的日期,结果为:20110510
bb_DATE=$(date "-d 10 day ago" +%Y%m%d)
//获取10天前的那天的日期,结果为:20110507
cc_DATE=$(date "-d 20 day ago" +%Y%m%d) 
//获取20天前的那天的日期,结果为:20110427
sudo rm /var/mysqldata/fz/mysql$aa_DATE.tar.gz 
//删除含有此日期的那个备份文件
sudo rm /var/mysqldata/mysql_$bb_DATE.sql 
//删除含有此日期的那个备份文件
sudo rm /var/mysql_backup/mysql_$cc_DATE.tar.gz 
//删除含有此日期的那个备份文件