在实际项目中,可能会遇到有客户机房断电导致数据库数据丢失的问题,又因为备份容灾不及时,导致部分数据恢复不了。使用
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到本地服务器