介绍数据库自动备份以及数据库被破坏后的恢复的方法,在这里,我们使用mysqlhotcopy,并且定义一段Shell脚本来实现数据库的自动备份,并且,让整个数据自动备份与数据恢复过程都基于Shell.
建立数据库备份所需条件
[1] 建立自动备份脚本
在这里,为了使数据库备份和恢复的符合我们的实际要求,用一段符合要求的Shell脚本来实现整个备份过程的自动化,代码如下:
[root@CentOS ~]# vi mysql-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
[2] 运行数据库自动备份脚本,代码如下:
- [root@CentOS~]#chmod700mysql-backup.sh改变脚本属性,让其只能让root用户执行
- [root@CentOS~]#./mysql-backup.sh运行脚本
- [root@CentOS~]#ls-l/backup/mysql/确认一下是否备份成功
- total8
- drwxr-x---2mysqlmysql4096Sep116:54mysql已成功备份到/backup/mysql目录中
[3] 让数据库备份脚本每天自动运行
[root@sample ~]# crontab -e ← 编辑自动运行规则,然后会出现编辑窗口,操作同vi.
00 03 * * * /root/mysql-backup.sh 添加这一行到文件中,让数据库备份每天凌晨3点进行.
测试自动备份正常运转与否,备份恢复的方法,这里,以通过实际操作的过程来介绍问题出现后的恢复方法.
[1] 当数据库被删除后的恢复方法.
首先建立一个测试用的数据库,代码如下:
[root@CentOS ~]# mysql -u root -p ← 用root登录到MySQL服务器:
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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,CentOS');←插入一个值到这个表(这里以“Hello,CentOS”为例)
- QueryOK,1rowaffected(0.02sec)
- mysql>select*fromtest;←查看数据库中的内容
- +------+-----------------+
- |num|name|
- +------+-----------------+
- |1|Hello,Centos|←确认刚刚插入到表中的值的存在
- +------+------------------+
- 1rowinset(0.01sec)
- mysql>exit←退出MySQL服务器
- Bye
然后,运行刚才建立的数据库备份脚本,备份刚刚建立的测试用的数据库.
[root@sample ~]# cd ← 回到脚本所在的root用户的根目录
[root@sample ~]# ./mysql-backup.sh ← 运行脚本进行数据库备份
接下来,我们再次登录到MySQL服务器中,删除刚刚建立的测试用的数据库test,以便于测试数据恢复能否成功,代码如下:
- [root@Centos~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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@Centos~]#/bin/cp-Rf/backup/mysql/test//var/lib/mysql/←复制备份的数据库test到相应目录
- [root@Centos~]#chown-Rmysql:mysql/var/lib/mysql/test/←改变数据库test的归属为mysql
- [root@Centos~]#chmod700/var/lib/mysql/test/←改变数据库目录属性为700
- [root@Centos~]#chmod660/var/lib/mysql/test/*←改变数据库中数据的属性为660
然后,再次登录到MySQL服务器上,看是否已经成功恢复了数据库,代码如下:
- [root@CentOS~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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,CentOS|←确认数据表中的内容与删除前定义的“Hello,CentOS”一样!
- +------+---------------------+
- 1rowinset(0.01sec)
- mysql>exit←退出MySQL服务器
- Bye
以上结果表示,数据库被删除后,用备份后的数据库成功的将数据恢复到了删除前的状态.
2] 当数据库被修改后的恢复方法
数据库被修改,可能存在着多方面的原因,被入侵、以及相应程序存在Bug等等,这里不作详细介绍,这里将只介绍在数据库被修改后,如果恢复到被修改前状态的方法.
具体和上面所述的“数据库被删除后的恢复方法”相类似,这里,测试用数据库接着使用刚刚在前面用过的test,这里为了使刚刚接触数据库的朋友不至于理解混乱,我们再次登录到MySQL服务器上确认一下刚刚建立的测试用的数据库test的相关信息,代码如下:
- [root@CentOS~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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,CentOS|
- +------+--------------------+
- 1rowinset(0.01sec)
- mysql>exit←退出MySQL服务器
- Bye
然后,我们再次运行数据库备份脚本,将当前状态的数据库,再做一次备份.
[root@CentOS ~]# cd ← 回到脚本所在的root用户的根目录
[root@CentOS ~]# ./mysql-backup.sh ← 运行脚本进行数据库备份
接下来,我们再次登录到MySQL服务器中,对测试用的数据库test进行一些修改,以便于测试数据恢复能否成功,代码如下:
- [root@sample~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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,CentOS”)
- 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@CentOS ~]# /bin/cp -Rf /backup/mysql/test/ /var/lib/mysql/ ← 复制备份的数据库test到相应目录.
然后,再次登录到MySQL服务器上,看数据库是否被恢复到了被“篡改”之前的状态,代码如下:
- [root@CentOS~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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,CentOS|←确认数据表中的内容与被修改前定义的“Hello,CentOS”一样!
- +------+----------------+
- 1rowinset(0.01sec)
- mysql>exit←退出MySQL服务器
- Bye
以上结果表示,数据库被修改后,用备份后的数据库成功的将数据恢复到了被“篡改”前的状态。
测试后…
测试完成后,将测试用过的遗留信息删除,代码如下:
- [root@CentOS~]#mysql-uroot-p←用root登录到MySQL服务器
- Enterpassword:←输入MySQL的root用户密码
- WelcometotheMySQLmonitor.Commandsendwith;org.
- 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--phpfensi.com
以上介绍了用我们自己建立的一段Shell脚本,通过mysqlhotcopy来备份数据库的方法.
对于许多个人爱好者来说,组建服务器可能不是很考虑数据被破坏以及数据被破坏后的恢复工作,但不能不说,对于服务器来说,数据破坏后的恢复效率也是区 别业余和专业的因素之一,所以笔者建议,在您配置好了Web服务器以及MySQL服务器等等的时候,千万不要急于应用它,而要想办法在有限的(硬件、软件)条件下使它“坚不可摧”之后,再考虑应用的问题.