mysql的自动备份与恢复mysqlhotcopy.docx
- 文档编号:24242724
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:7
- 大小:18.73KB
mysql的自动备份与恢复mysqlhotcopy.docx
《mysql的自动备份与恢复mysqlhotcopy.docx》由会员分享,可在线阅读,更多相关《mysql的自动备份与恢复mysqlhotcopy.docx(7页珍藏版)》请在冰豆网上搜索。
mysql的自动备份与恢复mysqlhotcopy
mysql的自动备份与恢复(mysqlhotcopy)
前 言
当数据库服务器建立好以后,我们首先要做的不是考虑要在这个支持数据库的服务器运行哪些受MySQL提携的程序,而是当数据库遭到破坏后,怎样安然恢复到最后一次正常的状态,使得数据的损失达到最小。
或者说,仅仅是数据库服务器的建立,只能说明它能做些什么,并不代表它能稳定的做些什么。
灾难恢复的效率及全面性,也是系统的稳定性的一个准因素,尤其对于一个服务器系统。
这一节,介绍数据库自动备份以及数据库被破坏后的恢复的方法。
在这里,我们使用mysqlhotcopy,并且定义一段Shell脚本来实现数据库的自动备份,并且,让整个数据自动备份与数据恢复过程都基于Shell。
建立数据库备份所需条件
[1]建立自动备份脚本
在这里,为了使数据库备份和恢复的符合我们的实际要求,用一段符合要求的Shell脚本来实现整个备份过程的自动化。
[root@sample~]#vimysql-backup.sh ←建立数据库自动备份脚本,如下:
#!
/bin/bash
PATH=/usr/local/sbin:
/usr/bin:
/bin
#TheDirectoryofBackup
BACKDIR=/backup/mysql
#ThePasswordofMySQL
ROOTPASS=******** ←将星号替换成MySQL的root密码
#RemaketheDirectoryofBackup
rm-rf$BACKDIR
mkdir-p$BACKDIR
#GettheNameofDatabase
DBLIST=`ls-p/var/lib/mysql|grep/|tr-d/`
#BackupwithDatabase
fordbnamein$DBLIST
do
mysqlhotcopy$dbname-uroot-p$ROOTPASS$BACKDIR|logger-tmysqlhotcopy
done
我的测试系统是redhatlinuxas4,mysql版本:
4.1.19,使用以上脚本有一个提示是DBD包没有安装。
根据README中的提示进行安装,如果在TAR包的MYSQL系统上安装DBD:
:
MYSQL,那么在设置环境时应使用如上命令:
perlMakefile.PL\
--libs="-L/usr/local/mysql-4.0.9/lib/mysql-lmysqlclient-lz"\
--cflags=-I/usr/local/mysql-4.0.9/include/mysql\
--testhost=127.0.0.1
接下来的命令没有必要执行,还有可能报错。
make
maketest #Someminorerrormessagescanbeignoredhere
makeinstall
若还是不行的话,请跟着做:
此时将/usr/local/mysql/include/mysql/*复制到/usr/include/,同时将/usr/local/mysql/lib/mysql/*复制到/usr/lib/,然后使用perlMakefile.PL设置环境,再进行后续的正常安装,就能正确连接到MYSQL数据库。
[2]运行数据库自动备份脚本
[root@sample~]#chmod700mysql-backup.sh ←改变脚本属性,让其只能让root用户执行
[root@sample~]#./mysql-backup.sh ←运行脚本
[root@sample~]#ls-l/backup/mysql/ ←确认一下是否备份成功
total8
drwxr-x---2mysqlmysql4096Sep116:
54mysql ←已成功备份到/backup/mysql目录中
[3]让数据库备份脚本每天自动运行
[root@sample~]#crontab-e ←编辑自动运行规则(然后会出现编辑窗口,操作同vi)
0003***/root/mysql-backup.sh ←添加这一行到文件中,让数据库备份每天凌晨3点进行
测试自动备份正常运转与否(备份恢复的方法)
这里,以通过实际操作的过程来介绍问题出现后的恢复方法。
[1]当数据库被删除后的恢复方法
首先建立一个测试用的数据库。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis8toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>createdatabasetest; ←建立一个测试用的数据库test
QueryOK,1rowaffected(0.00sec)
mysql>usetest ←连接到这个数据库
Databasechanged
mysql>createtabletest(numint,namevarchar(50)); ←在数据库中建立一个表
QueryOK,0rowsaffected(0.07sec)
mysql>insertintotestvalues(1,'Hello,BSD'); ←插入一个值到这个表(这里以“Hello,BSD”为例)
QueryOK,1rowaffected(0.02sec)
mysql>select*fromtest; ←查看数据库中的内容
+------+-------------+
|num|name |
+------+-------------+
|1 |Hello,BSD| ←确认刚刚插入到表中的值的存在
+------+-------------+
1rowinset(0.01sec)
mysql>exit ←退出MySQL服务器
Bye
然后,运行刚才建立的数据库备份脚本,备份刚刚建立的测试用的数据库。
[root@sample~]#cd ←回到脚本所在的root用户的根目录
[root@sample~]#./mysql-backup.sh ←运行脚本进行数据库备份
接下来,我们再次登录到MySQL服务器中,删除刚刚建立的测试用的数据库test,以便于测试数据恢复能否成功。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis13toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>usetest ←连接到测试用的test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>droptabletest; ←删除数据中的表
QueryOK,0rowsaffected(0.04sec)
mysql>dropdatabasetest; ←删除测试用数据库test
QueryOK,0rowsaffected(0.01sec)
mysql>showdatabases;
+-------------+
|Database|
+-------------+
|mysql | ←确认测试用的test数据库已不存在、已被删除
+-------------+
1rowinset(0.01sec)
mysql>exit ←退出MySQL服务器
Bye
以上,我们就等于模拟了数据库被破坏的过程。
接下来,是数据库被“破坏”后,用备份进行恢复的方法。
[root@sample~]#/bin/cp-Rf/backup/mysql/test//var/lib/mysql/ ←复制备份的数据库test到相应目录
[root@sample~]#chown-Rmysql:
mysql/var/lib/mysql/test/ ←改变数据库test的归属为mysql
[root@sample~]#chmod700/var/lib/mysql/test/ ←改变数据库目录属性为700
[root@sample~]#chmod660/var/lib/mysql/test/* ←改变数据库中数据的属性为660
然后,再次登录到MySQL服务器上,看是否已经成功恢复了数据库。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis14toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>showdatabases; ←查看当前存在的数据库
+-------------+
|Database|
+-------------+
|mysql |
|test | ←确认刚刚被删除的test数据库已经成功被恢复回来!
+------------+
2rowsinset(0.00sec)
mysql>usetest ←连接到test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>showtables; ←查看test数据库中存在的表
+-------------------+
|Tables_in_test|
+-------------------+
|test |
+-------------------+
1rowinset(0.00sec)
mysql>select*fromtest; ←查看数据库中的内容
+------+--------------+
|num|name |
+------+--------------+
|1 |Hello,BSD| ←确认数据表中的内容与删除前定义的“Hello,BSD”一样!
+------+--------------+
1rowinset(0.01sec)
mysql>exit ←退出MySQL服务器
Bye
以上结果表示,数据库被删除后,用备份后的数据库成功的将数据恢复到了删除前的状态。
[2]当数据库被修改后的恢复方法
数据库被修改,可能存在着多方面的原因,被入侵、以及相应程序存在Bug等等,这里不作详细介绍。
这里将只介绍在数据库被修改后,如果恢复到被修改前状态的方法。
具体和上面所述的“数据库被删除后的恢复方法”相类似。
这里,测试用数据库接着使用刚刚在前面用过的test。
这里为了使刚刚接触数据库的朋友不至于理解混乱,我们再次登录到MySQL服务器上确认一下刚刚建立的测试用的数据库test的相关信息。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis14toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>showdatabases; ←查看当前存在的数据库
+-------------+
|Database|
+-------------+
|mysql |
|test |
+------------+
2rowsinset(0.00sec)
mysql>usetest ←连接到test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>showtables; ←查看test数据库中存在的表
+-------------------+
|Tables_in_test|
+-------------------+
|test |
+-------------------+
1rowinset(0.00sec)
mysql>select*fromtest; ←查看数据库中的内容
+------+--------------+
|num|name |
+------+--------------+
|1 |Hello,BSD|
+------+--------------+
1rowinset(0.01sec)
mysql>exit ←退出MySQL服务器
Bye
然后,我们再次运行数据库备份脚本,将当前状态的数据库,再做一次备份。
[root@sample~]#cd ←回到脚本所在的root用户的根目录
[root@sample~]#./mysql-backup.sh ←运行脚本进行数据库备份
接下来,我们再次登录到MySQL服务器中,对测试用的数据库test进行一些修改,以便于测试数据恢复能否成功。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis15toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>usetest ←连接到test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>updatetestsetname='Shit,Windows'; ←然后将test中表的值重新定义为“Shit,Windows”(原来为“Hello,BSD”)
QueryOK,1rowaffected(0.07sec)
Rowsmatched:
1Changed:
1Warnings:
0
mysql>select*fromtest; ←确认test中的表被定义的值
+------+--------------------+
|num|name |
+------+-------------------+
|1 |Shit,Windows| ←确认已经将原test数据库表中的值修改为新的值“Shit,Windows”
+------+-------------------+
1rowinset(0.00sec)
mysql>exit ←退出MySQL服务器
Bye
以上,我们就等于模拟了数据库被篡改的过程。
接下来,是数据库被“篡改”后,用备份进行恢复的方法。
[root@sample~]#/bin/cp-Rf/backup/mysql/test//var/lib/mysql/ ←复制备份的数据库test到相应目录
然后,再次登录到MySQL服务器上,看数据库是否被恢复到了被“篡改”之前的状态。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis16toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>usetest ←连接到test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>select*fromtest; ←查看数据库中的内容
+------+----------------+
|num|name |
+------+----------------+
|1 |Hello,BSD | ←确认数据表中的内容与被修改前定义的“Hello,BSD”一样!
+------+----------------+
1rowinset(0.01sec)
mysql>exit ←退出MySQL服务器
Bye
以上结果表示,数据库被修改后,用备份后的数据库成功的将数据恢复到了被“篡改”前的状态。
测试后…
测试完成后,将测试用过的遗留信息删除。
[root@sample~]#mysql-uroot-p ←用root登录到MySQL服务器
Enterpassword:
←输入MySQL的root用户密码
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis19toserverversion:
4.1.20
Type'help;'or'\h'forhelp.Type'\c'toclearthebuffer.
mysql>usetest ←连接到test数据库
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>droptabletest; ←删除test数据库中的表
QueryOK,0rowsaffected(0.01sec)
mysql>dropdatabasetest; ←删除测试用数据库test
QueryOK,0rowsaffected(0.00sec)
mysql>showdatabases; ←查看当前存在的数据库
+-------------+
|Database|
+-------------+
|mysql | ←确认测试用数据库test不存在、已被删除
+-------------+
1rowinset(0.00sec)
mysql>exit ←退出MySQL服务器
Bye
--------
以上介绍了用我们自己建立的一段Shell脚本,通过mysqlhotcopy来备份数据库的方法。
对于许多个人爱好者来说,组建服务器可能不是很考虑数据被破坏以及数据被破坏后的恢复工作。
但不能不说,对于服务器来说,数据破坏后的恢复效率也是区别业余和专业的因素之一。
所以笔者建议,在您配置好了Web服务器以及MySQL服务器等等的时候,千万不要急于应用它,而要想办法在有限的(硬件、软件)条件下使它“坚不可摧”之后,再考虑应用的问题。
而且,以上介绍的方法中提到的数据库自动备份脚本虽然被设置为每天定时运行,但当您运行某些与MySQL相关联的程序(论坛、社区等等)时,做一些可能危及数据安全的操作的时候,运行数据库备份脚本即时备份当前状态数据库,也是非常有帮助的,至少可以在出现问题后保证数据库方面的可恢复性。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysql 自动 备份 恢复 mysqlhotcopy