在实际项目中,可能会遇到有客户机房断电导致数据库数据丢失的问题,又因为备份容灾不及时,导致部分数据恢复不了。使用windows的自动定时任务对数据库进行定时备份可以减少这种情况发生。但这样还不够安全,万一本地磁盘坏了,造成的损失将无法弥补,所以我们才要备份数据到单独的本地服务器

只要提供数据库的服务器地址ip、mysql数据库帐号、mysql数据库密码,就能执行程序了。

操作:

  • 可以备份多台远程服务器的数据库到本地
  • 可以备份一台服务器上面的全部库到本地
  • 服务器地址ip:192.168.1.15
  • mysql数据库帐号:root
  • mysql数据库密码:root

利用了.bat批处理文件的格式代码;
利用了mysql原生语句;
利用了mysql中的mysqldump程序;


结构解释

前提:本地服务器:A, 远程服务器:B, 远程服务器:C

把程序放在A下面,在A中填写B、C地址ip、帐号、密码

设定一个计划任务,每日凌晨执行index.php文件。

这时远程数据库就会备份到本地服务器A下面


文件解释

| account.php 帐号管理文件
| index.php 数据库备份执行文件
| page.php 添加帐号数据文件

有用的文章

  • 解决php网页运行超时问题:Maximum execution time of 30 seconds exceeded
  • Windows 下 MySQL 简单定时自动备份、删除过期备份
  • window系统下备份远程服务器mysql数据库

代码操作

account.php

存储地址、帐号、密码的一个文件

<?php
  $config = array (
    0 => 
      array (
        'localhost' => '192.168.1.15',
        'user' => 'root',
        'password' => '',
        'note' => '',
      ),
    1 => 
      array (
        'localhost' => '192.168.1.2',
        'user' => 'root',
        'password' => '',
        'note' => '',
      ),
  );
?>

page.php

添加账号、显示全部帐号

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>添加账号</title>
</head>
<?php
require_once 'account.php';
if ($_POST) {
	$count = count($config);
	$config[$count]['localhost'] = $_POST['localhost'];
	$config[$count]['user'] = $_POST[ 'user'];
	$config[$count]['password'] = $_POST[ 'password'];
	$config[$count][ 'note'] = $_POST[ 'note'];

	file_put_contents('account.php', '<?php $config = ' . var_export( $config, true) . ';?>');
	echo "<script language=JavaScript> location.replace(location.href);</script>";

}

//=========显示全部的
echo "<ul>";
for ($i=0; $i < count($config); $i++) {
	echo "<li>主机地址: " . $config[$i]['localhost'] . "</li>";
	echo "<li>账号: " . $config[$i][ 'user'] . "</li>";
	echo "<li>密码: " . $config[$i]['password'] . "</li>";
	echo "<li>备注: " . $config[$i]['note'] . "</li>";
	echo "----------------";
}
echo "</ul>";

?>


<form action="" method="post">
	<input type="text" value="" name="localhost" placeholder="主机地址">
	<input type="text" value="" name="user" placeholder="账号">
	<input type="text" value="" name="password" placeholder="密码">
	<input type="text" value="" name="note" placeholder="备注">
	<input type="submit" value="提交" name="dosubmit" >
</form>

</body>

</html>

index.php

执行程序文件

<?php 

//$localhost = '192.168.1.15';
//$user = 'root';
//$password = '';
//echo dataBackup( $localhost, $user, $password);


//密码验证,可以填写密码
if($_GET['psd']!='mima'){
	echo '';
}


//========账号数组,执行程序
require_once 'account.php';
foreach ( $config as $key => $value) {
	dataBackup( $config[$key]['localhost'], $config[$key]['user'], $config[$key][ 'password']);
}
//========账号数组,执行程序


/**
 * 利用批处理文件的含义,去处理
 * @return [type] [description]
 */
function dataBackup( $localhost = '', $user = '', $password = ''){

	//========需要保存的文件夹
	$doc_root=$_SERVER['DOCUMENT_ROOT'];
	$file_path_name=$doc_root. '/db_backup/' . date('Ymd').'_'. $localhost.'/'; //保存到的路径
	$name='_backup_'.date('YmdHis').'.sql';
	if(!file_exists($file_path_name)){mkdir($file_path_name,0777);}
	//========需要保存的文件夹

	//========mysql参数
	$mysqldump_url='H:\Developers\wampserver2.5\wamp\bin\mysql\mysql5.6.17\bin\mysqldump.exe';//mysqldump.exe的绝对路径,安装mysql自带的有,可以搜索一下路径
	$host= $localhost;//数据库所在的服务器地址
	$user= $user;//数据库用户名
	$password= $password;//数据库密码
	$port='3306';//数据库端口号
	//$databaseName='ceshi';//数据库名
	//========mysql参数

	$selectMysql = selectMysql( $host, $user, $password);	//查询mysql 全部的数据库

	//========下载
	for ($i = 0; $i < count( $selectMysql ); $i++) {
		$process=$mysqldump_url.' --opt --single-transaction=TRUE --user='.$user.' --password='.$password.' --host='.$host.' --protocol=tcp --port='.$port.' --default-character-set=utf8 --single-transaction=TRUE --routines --events "'. $selectMysql[$i].'" > '.$file_path_name.$selectMysql[$i].$name;
		$er=system($process);//system()执行外部程序,并且显示输出
	}
	//========下载




	if($er!==false){
		echo json_encode('success!');
	}else{
		echo json_encode('error!');
	}

}



/**
 * 查询mysql 全部的数据库
 */
function selectMysql($localhost='',$user='',$password=''){
	// connecting to MySQL. 连接到MysQL。
	$conn = @mysql_connect( $localhost, $user, $password) or die(mysql_errno() . ': ' . mysql_error());

	// attempt to get a list of MySQL databases 尝试获取MysQL数据库列表
	// already set up in my account. This is done 已经在我的账户上设置好了。这样做是
	// ~~using the PHP function: mysql_list_dbs() 使用PHP函数:mysql_list_dbs()~~
	// mysql_list_dbs 在 php5.4以后就过期了,所以换了一个 mysql_query( 'SHOW DATABASES');
	$result = mysql_query( 'SHOW DATABASES');

	// Output the list 输出列表
	//echo '<ul class="projects">' . NL;

	///* USING: mysql_fetch_object()

	// ---------------------------

	$arr = [];
	$num = 0;
	while ($row = mysql_fetch_object($result)) :
		$arr[$num] = $row->Database;
		//echo TB . '<li>' . $row->Database . '</li>' . NL;

		$num++;
	endwhile;

	//*/

	/* USING: mysql_fetch_row()

 // ------------------------

 while( $row = mysql_fetch_row( $result ) ):

  echo TB.'<li>'.$row[0].'</li>'.NL;

 endwhile;

 //*/

	/* USING: mysql_fetch_assoc()

 // --------------------------

 while( $row = mysql_fetch_assoc( $result ) ):

  echo TB.'<li>'.$row['Database'].'</li>'.NL;

 endwhile;

 //*/

	//echo '</ul>' . NL;

	// Free resources / close MySQL Connection

	mysql_free_result($result);

	mysql_close($conn);  
	return $arr;
}

 ?>

懒人可直接下载源码:windows系统备份远程mysql到本地服务器