欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【MySQL数据库备份恢复的两个实用方法】,下面是详细的分享!
MySQL数据库备份恢复的两个实用方法
以下为引用的内容:
方法1:
include
("../inc/globals.inc.php");//省略包函文件db_mysql.inc和MYSQL连接信息
set_time_limit(0);
$dbdir="d:/site/dbbak/";//用绝对路径
$txtname=array();
if($_POST){
if(!is_writable($dbdir)) {
echo "对不起!指定的备份目录不可写!请修改权限";
exit;
}
//op为一个隐形域,识别备份或者恢复
if($_POST["op"]){//备份数据
//生成每个表的临时备份文件
foreach($_POST["tbl_name"] as $tbl){
$txtname[]=$tbl.".txt";
$sql="SELECT * FROM `$tbl`
INTO OUTFILE '".$dbdir.end($txtname)."'";
$db->query($sql);
}
//将生成的临时备份文件合在一起
$outfile=date("Y-m-d").".sql";
if(file_exists($dbdir.$outfile)) @unlink($dbdir.$outfile);
$fpr=fopen($dbdir.$outfile, "a");
foreach($txtname as $txt){
if(file_exists($dbdir.$txt)){
//读取临时备份文件
$tdata=readfiles($dbdir.$txt);
//生成备份文件
$tbl=explode(".", $txt);
$str="`".$tbl[0]."`{{".$tdata."}}";
if(fwrite($fpr, $str)){
echo $tbl[0]."...写入 $outfile 成功!
\n";
}else{
echo $tbl[0]."...写入 $outfile 失败!
\n";
}
@unlink($dbdir.$txt);
}
}
fclose($fpr);
}else{//恢复数据
$tdata=readfiles($dbdir.$_POST["sqlfile"]);
preg_match_all("/`(.*)`\{\{(.*)\}\}/isU", $tdata, $data_ar);
foreach($data_ar[1] as $k=> $tt){
if(empty($data_ar[2][$k])) continue;
$tfile=$dbdir.$tt.".txt";
$fp=fopen($tfile, "w");
if(fwrite($fp, $data_ar[2][$k])){
//清空表
$sql="TRUNCATE TABLE `$tt`";
$db->query($sql);
//重新装入数据
$sql="LOAD DATA LOW_PRIORITY INFILE '
".$dbdir.$tt.".txt"."' INTO TABLE `$tt`";
if($db->query($sql)){
fclose($fp);
echo $tt."表数据恢复成功!
\n";
unlink($dbdir.$tt.".txt");
}else{
echo $tt."表数据恢复失败!
\n";
}
}
}
//echo $tdata;
//print_r($data_ar);
//exit;
}
}
function readfiles($file){
$tdata="";
$fp=fopen($file, "r");
if(filesize($file) <=0) return;
while($data=fread($fp, filesize($file))){
$tdata .=$data;
}
fclose($fp);
return $tdata;
}
?>
以下为引用的内容:
function table2sql($table)
{
global $db;
$tabledump="DROP TABLE IF EXISTS $table;\n";
$createtable=$db->query("SHOW CREATE TABLE $table");
$create=$db->fetch_row($createtable);
$tabledump .=$create[1].";\n\n";
return $tabledump;
}
function data2sql($table)
{
global $db;
$tabledump="DROP TABLE IF EXISTS $table;\n";
$createtable=$db->query("SHOW CREATE TABLE $table");
$create=$db->fetch_row($createtable);
$tabledump .=$create[1].";\n\n";
$rows=$db->query("SELECT * FROM $table");
$numfields=$db->num_fields($rows);
$numrows=$db->num_rows($rows);
while ($row=$db->fetch_row($rows))
{
$comma="";
$tabledump .="INSERT INTO $table VALUES(";
for($i=0; $i < $numfields; $i++)
{
$tabledump .=$comma."'".mysql_escape_string($row[$i])."'";
$comma=",";
}
$tabledump .=");\n";
}
$tabledump .="\n";
return $tabledump;
}
好,我们既然把代码都写出来了,
那么我们如何在具体的程序种去实现备份呢,我们看下面的代码。
// 注意:我们一下的数据库操作采用了phplib的DB类
// 定义要保存的数据表、前缀、保存到何处
$tables=array('us_sort', 'us_download',
'us_article', 'us_guestbook'); //定义要保存的数据表,一个数组
$prefix='us_'; // 要保存的.sql文件的前缀
$saveto='server'; // 要保存到什么地方,是本地还是服务器上,默认是服务器
$back_mode='all'; // 要保存的方式,是全部备份还是只保存数据库结构
$admin='heiyeluren'; //管理员名称
$admin_email='heiyeluren@163.com'; // 管理员邮箱
// 定义数据保存的文件名
$local_filename=$prefix.date('Ymd_His').'.sql"';
if (!$filename) { $filename=$db_backup_path .
$prefix . date('Ymd_His_').
create_check_code(4) . ".sql"; }
$filename=$prefix.date(Ymd_His).
create_check_ code(6).".sql"; // 保存在服务器上的文件名
// 注意后面的create_check_code()函数,这是一个生成随机码的函数
// 获取数据库结构和数据内容
foreach($tables as $table)
{
if ($back_mode=='all') { $sqldump .=data2sql($table); }
if ($back_mode=='table')
{ $sqldump .=table2sql($table); }
}
// 如果数据内容不是空就开始保存
if(trim($sqldump))
{
// 写入开头信息
$sqldump=
"# --------------------------------------------------------\n".
"# 数据表备份\n".
"#\n".
"# 服务器: $db->Host\n".
"# 数据库:$db->Database\n".
"# 备份编号: ". create_sess_id() ."\n". // 这里有一个生成session id的函数
"# 备份时间: ".time_to_date('',6)."\n". // 这里就是获取当前时间的函数
"#\n".
"# 管理员:$admin ($admin_email)\n". // 管理员的用户名和邮箱地址
"# $copyright\n".
"# --------------------------------------------------------\n\n\n".
$sqldump;
// 保存到本地
if($saveto=="local")
{
ob_end_clean();
header('Content-Encoding: none');
header('Content-Type: '.(strpos
($HTTP_SERVER_VARS['HTTP_USER_AGENT'], 'MSIE') ?
'application/octetstream' : 'application/octet-stream'));
header('Content-Disposition: '.(strpos
($HTTP_SERVER_VARS['HTTP_USER_AGENT'], 'MSIE') ?
'inline; ' : 'attachment; ').'filename="'.$local_filename);
header('Content-Length: '.strlen($sqldump));
header('Pragma: no-cache');
header('Expires: 0');
echo $sqldump;
}
// 保存到本地结束
// 保存在服务器
if($saveto=="server")
{
if($filename !="")
{
@$fp=fopen($filename, "w+");
if ($fp)
{
@flock($fp, 3);
if(@!fwrite($fp, $sqldump))
{
@fclose($fp);
exit_msg("数据文件无法保存到服务器,请检查目录属性你是否有写的权限。");
}
else
{
exit_msg("数据成功备份至服务器 $filename 中。");
}
}
else
{
exit_msg("无法打开你指定的目录". $filename .",
请确定该目录是否存在,或者是否有相应权限");
}
}
else
{
exit_msg("您没有输入备份文件名,请返回修改。");
}
}
// 保存到服务器结束
}
else
{
exit_msg("数据表没有任何内容");
}
以上所分享的是关于MySQL数据库备份恢复的两个实用方法,下面是编辑为你推荐的有价值的用户互动:
相关问题:如何使用MYSQL数据库进行备份数据恢复
答:恢复整个数据库 首先,如果要恢复的数据库是含有授权表的mysql数据库,将需要使用--skip-grant-tables选项运行服务器。否则,服务器将抱怨无法找到授权表。在恢复表之后,执行mysqladmin flush-privileges 来告诉服务器加载授权表,并用它们启动... >>详细
相关问题:如何使用sql语句备份和恢复mysql数据库
答:一般使用的命令: mysqldump --quick --database ondemand1 --u root >bacqup.sql 这样就能把数据库中ondemand1的表全部备份出来。 其中参数的格式是:--(两横杠,不是我们常用的单横杠) quick是在数据比较多的时候,不用该参数的话,所有的数... >>详细
相关问题:如何使用MySQLAdministrator备份和还原数据库
答:方法/步骤 1 双击“\MySQL Tools for 5.0\MySQLAdministrator.exe” 2 备份:点击OK,进入主界面如下图:点击倒数第三个Backup 3 点击:NewProject 后如下图: 4 在ProjectName:修改输入后,选择中要备份的数据库,按标有“>”按钮。 5 接着点击:Exe... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
