php中实现mysql数据库备份与linux自动定时备份代码
文章介绍了二种数据库备案的代码,一种是我们php写的常用的数据库备份类,另一种是为linux朋友提供的一个自动定时备份mysql数据库的代码,有需要的同学可以参考一下.
把下面php代码保存成backdata.class.php文件,代码如下:
- <?php
-
-
-
-
-
- class backupData{
- private $mysql_link;
- private $dbName;
- private $dataDir;
- private $tableNames;
-
- public function __construct($mysql_link){
- $this->mysql_link = $mysql_link;
- }
- public function backupTables($dbName,$dataDir,$tableNames){
- $this->dbName = $dbName;
- $this->dataDir = $dataDir;
- $this->tableNames = $tableNames;
- $tables=$this->delarray($this->tableNames);
- $sqls='';
- foreach($tables as $tablename){
- if($tablename==''){
- continue;
- }
-
-
-
- $sqls .= "DROP TABLE IF EXISTS $tablename;n";
-
- $rs = mysql_query("SHOW CREATE TABLE $tablename",$this->mysql_link);
- $row=mysql_fetch_row($rs);
-
- $sqls.=$row['1'].";nn";
- unset($rs);
- unset($row);
-
-
-
- $rs=mysql_query("select * from $tablename",$this->mysql_link);
-
- $field=mysql_num_fields($rs);
-
- while($rows=mysql_fetch_row($rs)){
- $comma='';
- $sqls.="INSERT INTO `$tablename` VALUES(";
- for($i=0;$i<$field;$i++){
- $sqls.=$comma."'".$rows[$i]."'";
- $comma=',';
- }
- $sqls.=");nnn";
- }
- }
- $backfilepath=$this->dataDir.date("Ymdhis",time()).'.sql';
-
-
- $filehandle = fopen($backfilepath, "w");
- fwrite($filehandle, $sqls);
- fclose($filehandle);
- }
- private function delarray($array){
- foreach($array as $tables){
- if($tables=='*'){
- $newtables=mysql_list_tables($this->dbName,$this->mysql_link);
- $tableList = array();
- for ($i = 0; $i < mysql_numrows($newtables); $i++){
- array_push($tableList,mysql_tablename($newtables, $i));
- }
- $tableList=$tableList;
- }else{
- $tableList=$array;
- break;
- }
- }
- return $tableList;
- }
- }
-
- ?>
我们再创建一个新的文件与backdata.class.php保存在同一目录,使用方法,代码如下:
- require_once("backdata.class.php");
- $link = @mysql_connect("localhost","数据库名","密码") or die ('Could not connect to server.');
- mysql_query("use cms",$link);
- mysql_query("set names utf8",$link);
- $dbbck=new backupData($link);
-
- $dbbck->backupTables("cms","./",array('*'));
-
- $dbbck->backupTables("cms","./",array('user'));
-
- $dbbck->backupTables("cms","./",array('user','acl','informatoin'));
-
参1为:数据库名.
参2为:要存放备份数据的位置,即目录地址.
第三个为:你要保存那些表.
下面为linux中的自动定时备份的代码,参考了网上的很多教程,外加自己的测试,以下脚本经测试可用,代码如下:
- #!/bin/bash
- #Shell Command For Backup MySQL Database Everyday Automatically By Crontab
- #Author : Carlos Wong
- #Date : 2010-08-24
- #配置参数
-
- USER=root #数据库用户名" >用户名
- PASSWORD=××××× #数据库用户密码
- DATABASE=TIENIUZAI #数据库名称
- WEBMASTER=tieniuzai@qq.com #管理员邮箱地址,用以发送备份失败消息提醒
- BACKUP_DIR=/var/www/Data_Backup/topons/ #备份文件存储路径
- LOGFILE=/var/www/Data_Backup/topons/data_backup.log #日记文件路径
- DATE=`date ‘+%Y%m%d-%H%M’` #日期格式(作为文件名)
- DUMPFILE=$DATE.sql #备份文件名
- ARCHIVE=$DATE.sql.tgz #压缩文件名
- OPTIONS=”-u$USER -p$PASSWORD –opt –extended-insert=false –triggers=false -R –hex-blob –flush-logs –delete-master-logs -B $DATABASE” #mysqldump 参数 详情见帮助 mysqldump -help
-
- #判断备份文件存储目录是否存在,否则创建该目录
- if [ ! -d $BACKUP_DIR ] ;
- then
- mkdir -p “$BACKUP_DIR”
- fi
-
- #开始备份之前,将备份信息头写入日记文件
- echo ” ” >> $LOGFILE
- echo ” ” >> $LOGFILE
- echo “———————————————–” >> $LOGFILE
- echo “BACKUP DATE:” $(date +”%y-%m-%d %H:%M:%S”) >> $LOGFILE
- echo “———————————————– ” >> $LOGFILE
-
- #切换至备份目录
- cd $BACKUP_DIR
- #使用mysqldump 命令备份制定数据库,并以格式化的时间戳命名备份文件
- mysqldump $OPTIONS > $DUMPFILE
- #判断数据库备份是否成功
- if [[ $? == 0 ]]; then
- #创建备份文件的压缩包
- tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1
- #输入备份成功的消息到日记文件
- echo “[$ARCHIVE] Backup Successful!” >> $LOGFILE
- #删除原始备份文件,只需保 留数据库备份文件的压缩包即可
- rm -f $DUMPFILE
- else
- echo “Database Backup Fail!” >> $LOGFILE
-
- #备份失败后向网站管理者发送邮件提醒,需要mailutils或者类似终端下发送邮件工具的支持
- #mail -s “Database:$DATABASE Daily Backup Fail” $WEBMASTER
- fi
- #输出备份过程结束的提醒消息
- echo “Backup Process Done”
使用方法:
将以上代码保存到:/usr/sbin/DataBackup,文件名随意,只要不跟系统原有的命令同名即可,代码可以放到任何地方,放在sbin目录下只是为了方便执行,sbin目录下的文件/目录可在终端直接调用,类似于windows下PATH变量指定的目录.
为脚本添加可执行权限:sudo chmod +x /usr/sbin/DataBackup
执行脚本:sudo DataBackup
如果需要定时执行备份命令的,只需将下面这段代码放到crontab 文件(sudo vim /etc/crontab)中去就可以了.
01 3 * * * root /usr/sbin/DataBackup #它代表着将于每天3点执行DataBackup脚本
注意:linux 下的shell脚本定义变量的格式为:key=value,注意他们两者之间的” = “前后不能出现空格,否则系统无法确认该变量.
第一个类似单引号的字符”`”其实不是单引号,它的输入键在键盘ESC键下方。
这个脚本只适合用于一些小站点的备份,因为它是对数据库进行全部备份而不是增量备份,不适合大容量的数据库备份.
相对于两种方法定时备份算是最好的方法了,这样可以节省时间让机器在最少人访问时自动备案,而php备份类需要人为操作,当然在windows下也可以利用计划任务来实现了.