您现在的位置: Tracy‘Blog > 博客 > Linux > 正文
Mysql自动备份批处理脚本

BugFree里面用的mysql作为数据库,为了保证数据的安全,还是每天下班后,让服务器自动备份一次数据库。

但也存在一个问题,数据库中文件是每天都在增加的,如果数据过多,太占内存,保存的日期多了,也相当占内存。

于是,提出一个冗余的概念,当出现故障时,能够最少程度的减少恢复。

发现故障的期限设置为7天,也就是,只保存最近七天的数据。

所以,实现的功能如下:

1.进行mysql数据备份

2.保存到制定文件夹

3.七天前的数据不保存

4.自动运行

首先想到的还是用批处理实现。

代码以及注释如下:

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::                               说明                                       ::
::1.自动备份数据库中mysql表到C:\db_backup下,以时间命名。如:2013-06-05.sql ::
::2.能自动删除七天以前的旧数据库备份文件                                    ::
::                                                                          ::
::                  2013-06-05          BY:Tracy_梓朋                       ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
::CHANGE THE DIRECT 你的路径不一定和我的一样,下面的可以更改
cd C:\xampp\mysql\bin
::DO BACKUP
mysqldump --opt -q mysql -u用户名 -p密码 -h服务器地址 >C:\db_backup\%date:~0,10%.sql
::CHANGE THE DIRECT 
cd\
::DELETE OLD THE FILES
setlocal enabledelayedexpansion
set d=%date:~0,10%
mshta vbscript:createobject("scripting.filesystemobject").opentextfile("temp.txt",2,true).write(dateadd("d",-7,"%d%"))(window.close)
for /f "tokens=1-3 delims=-" %%i in (temp.txt) do (
set _t1=000%%i
set _t2=000%%j
set _t3=000%%k
set t1=!_t1:~-4!-!_t2:~-2!-!_t3:~-2!)
for /f "delims= " %%i in ('dir /b c:\db_backup\*.sql') do (
set t3=%%~ni
if !t3! leq !t1! del /f /q "c:\db_backup\%%i")
del /f /q temp.txt

以上代码在win2003下测试可行。

不过,在winxp下,日期设置的地方,需要改动一下,实例如下:

set d=%date:~0,10%
mshta vbscript:createobject("scripting.filesystemobject").opentextfile("temp.txt",2,true).write(dateadd("d",-7,"%d%"))(window.close)
for /f "tokens=1-3 delims=-" %%i in (temp.txt) do (
set t1=%%i-%%j-%%k
set t2=!t1:~0,10!
)
for /f "delims= " %%i in ('dir /b c:\db_backup\*.rar') do (
set t3=%%~ni
if !t3! leq !t2! del /f /q "c:\db_backup\%%i")
del /f /q temp.txt

        原因是,在win2003的命令提示符中输入data,返回的是2013-6-7,而在winxp下返回的是2013-06-07。这也是为什么在03中要设置三个临时变量,并前在其前面都加上4个0,然后又只取其右多少位了。

 

        之后,再在计划任务中,添加计划,让机器在每天的某一个时段都备份一次。

        也或者可以用at命令来实现:

at 20:00 /every:M,T,W,Th,F,S,Su cmd /c c:\db_backup.bat

       

         第二天,远程连上服务器查看成果,结果发现只有一个1kb的sql文件。肯定是出错了。

         打开命令提示符,直接输入

mysqldump --opt -q mysql -u用户名 -p密码 >C:\db_backup\%date:~0,10%.sql
        报错如下:


        mysqldump: Couldn't execute 'show create table `general_log`': Table 'mysql.general_log' doesn't exist       

        mysqldump: Couldn't execute 'show create table `slow_log`': Table 'mysql.slow_log' doesn't exist 

        网上查了下,原因是mysql库中没有show_log表和general_log表,需要手动创建:

        于是连上mysql,

mysql -u用户名 -p密码 -h服务器地址

        输入下面的创建表的命令。

CREATE TABLE IF NOT EXISTS general_log (
  event_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  user_host mediumtext NOT NULL,
  thread_id int(11) NOT NULL,
  server_id int(10) unsigned NOT NULL,
  command_type varchar(64) NOT NULL,
  argument mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';


CREATE TABLE IF NOT EXISTS slow_log (
  start_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  user_host mediumtext NOT NULL,
  query_time time NOT NULL,
  lock_time time NOT NULL,
  rows_sent int(11) NOT NULL,
  rows_examined int(11) NOT NULL,
  db varchar(512) NOT NULL,
  last_insert_id int(11) NOT NULL,
  insert_id int(11) NOT NULL,
  server_id int(10) unsigned NOT NULL,
  sql_text mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';

        再次运行刚写的批处理,成功搞定。

        事后发现,遇到报下面这种错误的时候,也可以用到上面的解决办法。

        mysqldump: Couldn't execute 'show create table `general_log`': Can't find file: 'general_log' (errno: 2) (1017);

        我的做法是,直接删掉两张表,然后再用上面的新建表操作再新建这两张表。

DROP TABLE IF EXISTS `general_log`;
DROP TABLE IF EXISTS `slow_log`;
发表评论(1)
1楼   发表于  2014-2-27 23:04:58
不明觉厉啊
[博主回复]  老早前的了,最近整理博客,翻出来了~
姓名 *
电子邮件
QQ
评论内容 *
验证码 *图片看不清?点击重新得到验证码请输入图片后链接字符‘a’