引言:在上一家公司工作一年多了,基本是天天在复制别人的代码(我想很多同行都有同感!),很少有自己的东西。换工作后,发现要求自己的东西越来越多了。目前的工作,任务都要按时完成,觉得压力的同时也觉得很有激情,毕竟在压力之下我有了一些自己的东西。我想这会是个好的开始,我希望在今后能有更多更好自己的东西去与大家分享。ok,说正题。看标题就知道本文的主要内容了,很常见的问题---定时备份数据库!
我们先来看在windows下的bat:
@echo off
echo -------------------------
echo bat路径:%cd%
set batPath=%cd%
if not exist "%batPath%\resume_dump" (md "%batPath%\resume_dump")
set filePath="%batPath%\resume_dump"
echo resume backup start!
echo %date%
echo -------------------------
rem 数据库信息
set ip=10.0.6.108
set port=3306
set databaseName=resume
set useName=root
set passWord=123456
rem 获取系统日期
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set test_db=resume_db_%year%%month%%day%.sql
mysqldump -h%ip% -P%port% -u%useName% -p%passWord% --opt --default-character-set=utf8 --hex-blob -R -B %databaseName% >%filePath%\%test_db%
rem 环境变量没配,导致备份失败,则跳到自动搜索目录
if ERRORLEVEL 1 goto backupFail
rem 备份成功,退出
if ERRORLEVEL 0 goto outBat
:outBat
echo 数据库备份成功!
exit
:backupFail
for %%i in (c d e f g) do for /f "delims=" %%a in ('dir /a-d /s /b %%i:\mysqldump.exe') do (if exist "%%a" ( set var=%%a &goto c
))
:c
echo %var:~0,-15%
set panf=%var:~0,2%
%panf%
cd %var:~0,-15%
mysqldump -h%ip% -P%port% -u%useName% -p%passWord% --opt --default-character-set=utf8 --hex-blob -R -B %databaseName% >%filePath%\%test_db%
echo 数据库备份成功!!!
@echo off
echo resume backup end!
代码解释
echo %date%
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
set test_db=resume_db_%year%%month%%day%.sql
以上的几行代码无非是获得系统时间,以日期给文件命名。
cd C:\Program Files\MySQL\MySQL Server 5.5\bin:这句是到mysql的bin目录下去执行接下来的命令,不去肯定是不行的(网上说可以配置环境变量,但我还不知道咋搞的,有知道的还望指教啊!)。
mysqldump -h10.0.6.108 -uroot -p123456 --opt --default-character-set=utf8 --hex-blob -R resume >c:\mysql_dump\%test_db%
这句是整个bat最核心的语句了,mysqldump主要功能是用于mysql的导出。-h [数据库所在主机的ip] -u[用户名] -p[密码] -R 表示导出存储过程和函数 resume 是服务器上的数据库,mysqldump的参数有很多,我会将其参数的使用写在我另一篇文章里面。 --default-character-set=utf8 这句是用来规定编码的,因为服务器上数据库的编码是utf8的,所以在这里必须这样做,不这样的话貌似会有乱码。--hex-blob 是将二进制转换为16进制,因为服务器上的数据库中有张表里面存放的是图片的信息(二进制),不写这句,二进制部分会是乱码(这个问题困扰了我一个多星期,后来是无意间找到了解决方案,大喜!)。至于 >c:\mysql_dump\%test_db% 就是将导出的数据写到对应的文件中去。最后将此bat加入到windows的定时任务中去就可以实现定时备份数据了。
由于按照上级要求,需要去判断服务器是否配置了相应的环境变量,所以在此也比较麻烦的去进行了判断(大致原理是这样的:先去执行备份语句,如果成功了就直接跳出,如果没有成功则去找到对应的目录然后再执行备份语句)
for %%i in (c d e f g) do for /f "delims=" %%a in ('dir /a-d /s /b %%i:\mysqldump.exe') do (if exist "%%a" ( set var=%%a &goto c ))
这条语句就是用来找到执行目录的,我这里是通过mysqldump.exe文件去找的。
Linux下的shell:
#!/bin/bash
echo "RESUME BACKUP START"
filePath=$(cd "$(dirname "$0")";pwd)
dirPath="$filePath/resume_dump/"
echo $dirPath
if [ -d "$dirPath" ]; then
echo "文件夹已存在!"
else
mkdir "$dirPath"
fi
ip=10.0.6.108
useName=root
passWord=123456
port=3306
databaseName=resume
today=`date -d today +%Y%m%d`
test_db=resume_db_$today.sql
(mysqldump -h$ip -P$port -u$useName -p$passWord --default-character-set=utf8 --hex-blob -R -B $databaseName >$dirPath/$test_db)||
(file=`find / -name mysqldump`
dir=`dirname $file`
cd $dir
echo `pwd`
mysqldump -h$ip -P$port -u$useName -p$passWord --default-character-set=utf8 --hex-blob -R -B $databaseName >$dirPath/$test_db)
echo "RESUME BACKUP END"
代码解释
代码就不再解释了,跟上面的bat基本一样,主要是找目录就相对简单多了(file=`find / -name mysqldump`(找到文件),dir=`dirname $file`(获得文件目录))。至于定时任务用crontab就可以实现了。
简单的说下如何导入:
进入需要导入的数据库后,执行mysql -uroot -p123456 database </home/$test_db(上面导出的文件) 或者( source /home/$test_db (上面导出的文件))。