生产环境下数据库服务器备份策略参考

定期自动备份,备份文件很频繁,需要定期(1-2个月为宜)清理一些过于频繁的,然后做归档

暂定清理2个月前的备份,清理后,将保留的移到归档目录里,长期保留
暂定每个月保留两份,1日及16日左右
两个月内的备份,全部保留,以备不时之需

长期保留的归档,可以视情况再做精简清理。
定期选择部分下载异地备份

linux下tar命令的奇葩用法(可用来保留目录修改时间的复制整个目录)

linux下tar命令的奇葩用法:
tar -cvf - /etc | tar -xvf -

其中 /etc 可以改成任何需要备份的目录
以前在鸟哥linux里 http://linux.vbird.org/linux_basic/0240tarcompress.php#tar 见到的,当时不知道有什么用:这不就是cp -r,干吗写这么啰嗦。原来它可“原封不动”的备份,包括文件目录的修改时间;cp -r复制出来的目录修改时间是当前时间。要将一个目录复制一下,可又想保留目录修改时间(这是时间非常有用),之前是tar打包的,用的时候再解开(或当场就解开,并删除tar包);突然意识到,tar的这个奇葩用户正是所需!

 

一个使用tar实现对目录作增量备份的bash脚本

一个使用tar实现对目录作增量备份的bash脚本

#!/bin/bash
#program:
#  auto backup the folder $to_backup
#        to $save_to
#  History:
# 2012/11/28  yqf First release

# do NOT change the variable $filename
#  except you REALY know what you are doing exactly
filename=`date +%Y%m%d_%H%M%S`

# sample
# ##whitch folder you want to backup, full path (start with "/")
#to_backup="/var/www/html/foo"
# ##where you whant to save the backup files,folder, MUST end by "/"
#save_to="/var/www/backup/foo/"
# ##the incremental file, file name, full path
#incremental_file="/var/www/backup/incremental_file/foo.incre"
#
#tar -g $incremental_file \
# ## each files or folders that no need to backup, (ingore),
# ##    [Careful] without end slash even folder
#  -C $to_backup \
#  --exclude data/cache \
#  --exclude data/tmp \
#  -cpjf $save_to$filename.tar.bz2 .
# sample end
#
# mysite.com
to_backup="/var/www/html/mysite/html/"
save_to="/home/myhome/backup/mysite/"
incremental_file="/home/myhome/backup/incremenntal_list/mysite.increment_file"

tar -g $incremental_file \
  -C $to_backup \
  --exclude data/static_cache \
  --exclude data/templates_c \
  --exclude data/templates_cache \
  --exclude data/cache \
  -cpjf $save_to$filename.tar.bz2 .

下载脚本附件 tar_incremental_backup_sample
其中....似乎很简单,不用说什么了

tar 打包备份目录时分卷打包压缩(增量备份,并自动分割成多个文件)

tar 增量备份打包目录,并分卷打包压缩(自动分割成多个文件)

tar -g /home/my_name/backup/incremenntal_list/my_website.incremenntal_list \
  -C /var/www/html/ \
  --exclude data/cache \
  --exclude data/tmp \
  -cpjvf - /var/www/html/ |split -b 2g

-g xxx  是增量日志文件,再次执行上面命令备份目录时,没有改变的文件将不备份,这样节省备份占用硬盘;需要还原时,同样要带上该参数,后边跟上该文件路径,而且要按备份的次序一个一个解包

--exclude xxx 是排除的目录,被tar忽略而不备份

split -b 2g 分割为2G的文件,分割文件名字将是 xaa, xab, xac ...

备份文件还原时,使用以下命令:

cat xaa xab xac >tar -xj

注意,1)省略了上述-g 参数,如果备份时用了这里就要带上。

2)假设只有三个分卷文件,如果不止三个,那就依次写出即可。事实上 cat  `ls x*` >tar -xj 也可以,但如果`ls x*`出来的次序是乱的,那就要解包失败。

使用cygwin在windows下自动备份目录数据/注册cygwin为windows服务

windows下备份目录是个蛋疼的事情,而linux的备份功能实在彪悍的让人感激涕零,然而对于出卖灵魂维护windows服务器的人士,在鄙视windows之余,还是得解决这个问题。突然想到cygwin这个强大的工具,是否可以在windows下使用它crond/crontab呢?查了一下,还真的有。

,先记来来,有时间研究一下

http://blog.csdn.net/cg_cheng/article/details/4377307  在cygwin下配置crontab

http://www.cnblogs.com/alaska1131/articles/1655643.html   windows下启动cygwin的cron/crontab

linux下使用tar差异化备份目录

tar命令的参数 -g, 后面跟一个文件路径,就可在该文件里记录下差异化日志记录,每次备份时带上该参数及文件路径,即是差异备份。还原时,也应该带上这个参数,否则,每次差异备份时删除的文件将不会自动删除。

tar命令的参数 --exclude=,后面跟一个文件路径(支持通配符),指备份时忽略指定的文件(包括目录),如有多个忽略文件,那就加多次该参数,每次指定一个忽略目录。

tar命令的-p参数,指打包时保留文件权限

需要还原文件时,就按备份的次序依次执行-x解包时,记得要带上-g参数,别忘了后面的差异化日志记录文件,这样每次备份时删除的文件也会自动在还原的目标目录里删除;当然你想保留所有文件时另说。

 

简单命令对mysql数据库的备份与还原

使用phpMyAdmin备份mysql数据库

备份mysql的最简单方法是的使用phpMyAdmin的“导出”功能,导出成sql文件,不用管其它选项,只管导出就可以,这就是mysql标准的备份文件。

导出时,一般不要勾选压缩选项。因为如果备份文件大到一定程度,就会因为php分配不到足够内存而死掉;经验是50M以上的表,就不要压缩了。这是个蛋疼的事情:小文件不值得压缩,大了反而压缩不动。所以不压缩就是了。

还原mysql数据库

要还原mysql数据库时,使用phpMyAdmin是个简单的方法,但更容易因为备份文件过大而超过php内存限制而死掉,这时你会有种痛不欲生的感觉。

推荐使用命令行连接mysql,以source命令导入还原,这个导入过程是件愉悦的事情。

不幸的是如果你在windows下,会比较啰嗦:

把你的mysql备份文件放到一个比较浅的目录里,比如放在 E:\120507.sql ,你要还原的数据库叫mydata

找到你的mysql安装在哪里,假如你的mysql安装在D:\Program Files\MySQL\MySQL Server 5.0 ,那么你的mysql命令行客户端将位于D:\Program Files\MySQL\MySQL Server 5.0\bin ,按着按下面的步骤来:

  • 1. 开始-运行,输入cmd,确定,你将进入命令行界面
  • 2. 输入 d: 然后回车,进入D盘
  • 3. 输入cd "D:\Program Files\MySQL\MySQL Server 5.0\bin" 再回车(注意,如果路径中有空格,那引号是必须的)
  • 4. 输入mysql -uroot -p123456 --default-character-set=utf8 --max_allowed_packet=16777216 --net_buffer_length=16384 回车(假设你的mysql的root用户密码是123456, 注意,这里u与p后面带不带空格都可以,我习惯不带; 你只需改这行命令里的密码部分,其它不需要改变,照用即可)
  • 你将看到

    注意到光标闪烁处的mysql> ,这就说明已经成功连接到本机的mysql数据库。
  • 输入use mydata 回车 ,进入mydata数据库
  • 输入source E:\120507.sql 回车,你将看到一行行快速滚动的信息。滚动完毕就导入完成了。
  • 输入exit驾车即可。回到phpmyadmin里看导入的结果吧.

核心回顾

mysql备份,使用phpMyAdmin,导出需要的表,或整个数据库,注意最好不要勾选压缩

还原,使用命令行客户端连上mysql服务器,mysql -uroot -p123456 --default-character-set=utf8 --max_allowed_packet=16777216 --net_buffer_length=16384,然后use mydata进入需要还原的数据库,运行source x:\bakup_file.sql 导入备份。

不用“维护计划”实现mssql定期备份并压缩存档

mssql有命令行客户端工作,可以通过bat脚本调用命令行工具执行备份命令,这样还可以很方便的调用7z,(win)rar等来自动压缩,比mssql 自带的维护计划灵活多了。“维护计划”好像也可以调用压缩工具,只是要启用xp_cmd这个很风险的存储过程,让人不安心,所以一般不这么用,备份文件都是手工压缩再下载到本地存档备份。

MS sql 的官方命令行客户端叫sqlcmd,ms sql2005默认安装的,位于 X:\Program Files\Microsoft SQL Server\90\Tools\Binn ,该目录会被自动加入windows 的PATH环境变量中,所以可以直接调用,先看看基本的帮助文档:

C:\Documents and Settings\Administrator>sqlcmd /?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。

用法: Sqlcmd            [-U 登录 ID]          [-P 密码]
 [-S 服务器]            [-H 主机名]          [-E 可信连接]
 [-d 使用数据库名称] [-l 登录超时值]     [-t 查询超时值]
 [-h 标题]           [-s 列分隔符]      [-w 屏幕宽度]
 [-a 数据包大小]        [-e 回显输入]        [-I 允许带引号的标识符]
 [-c 命令结束]            [-L[c] 列出服务器[清除输出]]
 [-q "命令行查询"]   [-Q "命令行查询" 并退出]
 [-m 错误级别]        [-V 严重级别]     [-W 删除尾随空格]
 [-u unicode 输出]    [-r[0|1] 发送到 stderr 的消息]
 [-i 输入文件]         [-o 输出文件]        [-z 新密码]
 [-f <代码页> | i:<代码页>[,o:<代码页>]] [-Z 新建密码并退出]
 [-k[1|2] 删除[替换]控制字符]
 [-y 可变长度类型显示宽度]
 [-Y 固定长度类型显示宽度]
 [-p[1] 打印统计信息[冒号格式]]
 [-R 使用客户端区域设置]
 [-b 出错时中止批处理]
 [-v 变量 = "值"...]  [-A 专用管理连接]
 [-X[1] 禁用命令、启动脚本、环境变量[并退出]]
 [-x 禁用变量情况]
 [-? 显示语法摘要]

C:\Documents and Settings\Administrator>

详细参数介绍可以参看这里: sql server 2005 使用命令行备份数据

一个最简单的一个命令行备份实例

C:\Documents and Settings\Administrator>sqlcmd -U sa -P sa -S localhost -Q "backup database foo to disk='f:\backup\foo_110630.bak'"
已为数据库 'foo',文件 'foo' (位于文件 1 上)处理了 5032 页。
已为数据库 'foo',文件 'foo_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 5033 页,花费 1.871 秒(22.036 MB/秒)。

一个比较完善的自动批处理脚本

一个比较完善的自动批处理脚本,可以同时备份并rar压缩多个数据库,可以按需要在此基础上修改改进。

@ECHO ON
set d=%date:~0,10%
set d=%d:-=%
set t=%time:~0,8%
set t=%t::=%
set stamp=%p%%d%%t%
set bakupfolder=F:\backup\
rem    1按子目录保存备份文件;0不按
set lay_in_subfolder=1

call :backupone foo
call :backupone foo2
call :backupone foo3
call :backupone foo4

goto :EOF  

@ECHO OFF

:backupone 
setlocal 
echo %1 
set dbname=%1
if not exist %bakupfolder%%dbname% mkdir %bakupfolder%%dbname%

if %lay_in_subfolder%==1 (
set subfolder=%dbname%\
)else set subfolder=
rem echo %bakupfolder%%subfolder%%dbname%%stamp%.bak
sqlcmd -U sa -P "sa" -S localhost -Q "backup database %dbname% to disk='%bakupfolder%%subfolder%%dbname%%stamp%.bak'"
"C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%bakupfolder%%subfolder%%dbname%%stamp%".rar "%bakupfolder%%subfolder%%dbname%%stamp%.bak"

endlocal&goto :EOF

脚本说明

1. set bakupfolder=F:\backup\

备份文件存放于目录F:\backup\ (此目录需要事先建好)

2. 默认每个数据库放置到bakupfolder下的同名的子目录(脚本自动创建)中;设置lay_in_subfolder=0后,将直接放置到bakupfolder

3. 备份文件名中自动添加备份时的时间字符串,不用担心备份目录下名字重复,也便于管理。

4. call :backupone foo

foo是需要备份的数据库,需要备份其它数据库,按同样的方式一行写一条即可

这是在批处理里中调用自定义函数

5. 命令行驱动备份操作:sqlcmd -U sa -P "sa" -S localhost -Q "xxx"

这里连接数据库的用户名密码都是sa,请改成你的实际用户名密码。mssql密码中如果有一些特殊字符,可能报错,所以加上双引号。如果密码简单,不加也可以;不过sa密码,一般都是很变态的吧~~

备份脚本的调用

加到windows计划任务里,定期执行,是一个很好的主意。

上面脚本里,只对mssql数据库执行了备份的操作,如果加入整理索引碎片、重建索引等维护操作,也是很好的自动化维护方案。

这样处理,就可以弃用mssql自带的“维护计划”了。

------ 在windows2008下使用请参阅如下 ---- 20130723 补------------

windows 2008的命令行下,date输出的日期,默认使用/作为分隔符,这样上面的脚本就不行了,要把第三行 set d=%d:-=% 作下修改:

set d=%d:/=%

其它不用变。

ms sql server 2005维护计划(备份)失败:应用于目标服务器 对于 xx 失败

ms sql server 2005维护计划(备份)失败:应用于目标服务器 对于 xx 失败,消息如下

应用于目标服务器 对于 xx 失败

ms sql server 2005维护计划(备份)失败:应用于目标服务器 对于 xx 失败

而这个错误,又没有详细的说明,为什么失败,失败在哪里;不说明详细原因,这也是微软的产品经常让人很崩溃的重要原因之一。

网上也有人遇到这这种问题,只是找了个遍也都没有看到解决方法;不知道是否重启一下windows会不会好,但因为是生产环境的服务器,不便于重启。

突然想起命令行,命令行工具!mssql有命令行客户端工作,只是没有用过,应该可以通过bat脚本调用命令行工具执行备份命令,这样还可以很方便的调用7z,(win)rar等来自动压缩,比mssql 自带的维护计划灵活多了。“维护计划”好像也可以调用压缩工具,只是要启用xp_cmd这个很风险的存储过程,让人不安心,所以一般不这么用,备份文件都是手工压缩再下载到本地存档备份。

MS sql 的官方命令行客户端叫sqlcmd,ms sql2005默认安装的,位于 X:\Program Files\Microsoft SQL Server\90\Tools\Binn ,该目录会被自动加入windows 的PATH环境变量中,所以可以直接调用,先看看基本的帮助文档:

C:\Documents and Settings\Administrator>sqlcmd /?
Microsoft (R) SQL Server 命令行工具
版本 9.00.1399.06 NT INTEL X86
版权所有 (c) Microsoft Corporation。保留所有权利。

用法: Sqlcmd            [-U 登录 ID]          [-P 密码]
 [-S 服务器]            [-H 主机名]          [-E 可信连接]
 [-d 使用数据库名称] [-l 登录超时值]     [-t 查询超时值]
 [-h 标题]           [-s 列分隔符]      [-w 屏幕宽度]
 [-a 数据包大小]        [-e 回显输入]        [-I 允许带引号的标识符]
 [-c 命令结束]            [-L[c] 列出服务器[清除输出]]
 [-q "命令行查询"]   [-Q "命令行查询" 并退出]
 [-m 错误级别]        [-V 严重级别]     [-W 删除尾随空格]
 [-u unicode 输出]    [-r[0|1] 发送到 stderr 的消息]
 [-i 输入文件]         [-o 输出文件]        [-z 新密码]
 [-f <代码页> | i:<代码页>[,o:<代码页>]] [-Z 新建密码并退出]
 [-k[1|2] 删除[替换]控制字符]
 [-y 可变长度类型显示宽度]
 [-Y 固定长度类型显示宽度]
 [-p[1] 打印统计信息[冒号格式]]
 [-R 使用客户端区域设置]
 [-b 出错时中止批处理]
 [-v 变量 = "值"...]  [-A 专用管理连接]
 [-X[1] 禁用命令、启动脚本、环境变量[并退出]]
 [-x 禁用变量情况]
 [-? 显示语法摘要]

C:\Documents and Settings\Administrator>

详细参数介绍可以参看这里: sql server 2005 使用命令行备份数据

一个最简单的一个命令行备份实例

C:\Documents and Settings\Administrator>sqlcmd -U sa -P sa -S localhost -Q "backup database foo to disk='f:\backup\foo_110630.bak'"
已为数据库 'foo',文件 'foo' (位于文件 1 上)处理了 5032 页。
已为数据库 'foo',文件 'foo_log' (位于文件 1 上)处理了 1 页。
BACKUP DATABASE 成功处理了 5033 页,花费 1.871 秒(22.036 MB/秒)。

一个比较完善的自动批处理脚本

一个比较完善的自动批处理脚本,可以同时备份并rar压缩多个数据库,可以按需要在此基础上修改改进。

@ECHO ON
set d=%date:~0,10%
set d=%d:-=%
set t=%time:~0,8%
set t=%t::=%
set stamp=%p%%d%%t%
set bakupfolder=F:\backup\
rem    1按子目录保存备份文件;0不按
set lay_in_subfolder=1

call :backupone foo
call :backupone foo2
call :backupone foo3
call :backupone foo4

goto :EOF  

@ECHO OFF

:backupone 
setlocal 
echo %1 
set dbname=%1
if not exist %bakupfolder%%dbname% mkdir %bakupfolder%%dbname%

if %lay_in_subfolder%==1 (
set subfolder=%dbname%\
)else set subfolder=
rem echo %bakupfolder%%subfolder%%dbname%%stamp%.bak
sqlcmd -U sa -P "sa" -S localhost -Q "backup database %dbname% to disk='%bakupfolder%%subfolder%%dbname%%stamp%.bak'"
"C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%bakupfolder%%subfolder%%dbname%%stamp%".rar "%bakupfolder%%subfolder%%dbname%%stamp%.bak"

endlocal&goto :EOF

脚本说明

1. set bakupfolder=F:\backup\

备份文件存放于目录F:\backup\ (此目录需要事先建好)

2. 默认每个数据库放置到bakupfolder下的同名的子目录(脚本自动创建)中;设置lay_in_subfolder=0后,将直接放置到bakupfolder

3. 备份文件名中自动添加备份时的时间字符串,不用担心备份目录下名字重复,也便于管理。

4. call :backupone foo

foo是需要备份的数据库,需要备份其它数据库,按同样的方式一行写一条即可

这是在批处理里中调用自定义函数

5. 命令行驱动备份操作:sqlcmd -U sa -P "sa" -S localhost -Q "xxx"

这里连接数据库的用户名密码都是sa,请改成你的实际用户名密码。mssql密码中如果有一些特殊字符,可能报错,所以加上双引号。如果密码简单,不加也可以;不过sa密码,一般都是很变态的吧~~

备份脚本的调用

加到windows计划任务里,定期执行,是一个很好的主意。

上面脚本里,只对mssql数据库执行了备份的操作,如果加入整理索引碎片、重建索引等维护操作,也是很好的自动化维护方案。

这样处理,就可以弃用mssql自带的“维护计划”了。

windows下mysql自动定期备份并压缩/以discuz论坛为例

工作环境 Windows Server 2003 ,MySQL安装目录 D:\Program Files\MySQL\MySQL Server 5.0 , WinRAR 安装目录 C:\Program Files\WinRAR
备份数据存储的路径为 E:\dataBackup\MySQL .下面即是windows命令行批处理命令的源文件

代码如下:

set d=%date:~0,10%
set d=%d:-=%
set t=%time:~0,8%
set t=%t::=%
set dzxpath=dzx%p%%d%%t%.sql
set ucpath=uc%p%%d%%t%.sql
set folder=E:\dataBackup\MySQL\
echo off

"D:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump.exe" -hlocalhost --opt -uroot -pyoumysqlrootpassword discuzx > "%folder%%dzxpath%"
"C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%folder%%dzxpath%".rar "%folder%%dzxpath%"
"D:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump.exe" -hlocalhost --opt -uroot -pyoumysqlrootpassword discuzuc uc_admins uc_applications uc_badwords uc_domains uc_failedlogins uc_feeds uc_friends uc_mailqueue uc_memberfields uc_members uc_mergemembers uc_newpm uc_notelist uc_pms uc_protectedmembers uc_settings uc_sqlcache uc_tags uc_vars > "%folder%%ucpath%"
"C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%folder%%ucpath%".rar "%folder%%dzxpath%"
rem echo "D:\Program Files\MySQL\MySQL Server 5.0\data\discuzx\%filepath%"

"D:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump.exe" -hlocalhost --opt -e --max_allowed_packet=1048576 --net_buffer_length=16384 -uroot -pyourrootpasswd discuzx > "%folder%%dzxpath%"
rem "C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%folder%%dzxpath%".rar "%folder%%dzxpath%" 

"D:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump.exe" -hlocalhost --opt -e --max_allowed_packet=1048576 --net_buffer_length=16384 -uroot -pyourrootpassw mydb > "%folder%%mydbpath%"

"C:\Program Files\WinRAR\RAR.exe" a -ep1 -r -o+ -m5 -s -df "%folder%%mydbpath%".rar "%folder%%mydbpath%"  "%folder%%dzxpath%"
rem echo "D:\Program Files\MySQL\MySQL Server 5.0\data\discuzx\%filepath%"
rem pause

----------------------

可以直接下载该.bat批处理文件: mysql_dump

这里需要使用winrar,假定安装在 C:\Program Files\WinRAR\ 上面代码里使用的是 rar.exe 这个命令行版的rar工具(推荐),而不是winrar.exe这个图形化版本。当然要检查你的winrar安装目录里是否有rar.exe这个文件,如果没有,建议重新下载完整版的winrar.

这里假定需要备份数据库discuzx与discuzuc中的几个表(ucenter表) [如果升级安装discuzx,而又没有把ucenter导入discuzx的库里,就是这种情况]

把上面的命令保存为 mysql_dump.bat ,双击即可运行。为了实现无人值守的自动化处理,可以通过系统的任务计划定期执行这个命令。

如不会windows任务计划请自行搜索学习,这里恕不赘述。