PHP备份数据库的原理和方法 57
1、PHP备份数据库的原理
查找所有表--查找所有字段(需要列出所有字段名,
字段类型等相关信
息)---查找所有数据(读取数据出来注意
特殊符号的转换
addslashes
())--生成SQL(把数据格式化
生成对应的SQL)
通过相关函数输出SQL相关信息,并格式化后生成文件,保存!
2、PHP中mysql相关函数
mysql_list_tables() 表查询函数,类似mysql_query() 函数
mysql_fetch_field() 字段信息函数,返回句柄
Name 字段的名称
Table 字段所属数据表的名称
Type 字段的类型max_length 字段的最大长度not_null 字段是否不能
为空,是,则这一项的值为1primary_key 字段是否为主键,是,则这
一项的值为1unique_key 字段是否为unique键,是,则这一项的值为
1
multiple_key 字段是否不为unique键,是,则这一项的值为1
Numeric 字段是否为数字型,是,则这一项的值为1Blob 字段是否为
blob型,是,则这一项的值为1
Unsigned 数字型的字段是否为unsigned的,是,则这一项的值为1
Zerofill 数字型的字段是否为zerofilled是,则这一项的值为1
CREATE TABLE `help_category` (
`help_category_id` int(5)
unsigned NOT NULL,
`name` char(64) NOT NULL
)
3、备份时候的注意事项 1、注意数据库的大小,过大或者过多的表
分段处理 2、生成的SQL文件名或者存放不易被猜到 3、备份生
成文件可以表或者自动为单位保存 4、可以使用ZIP组件压缩生成的
文件以便保持
----------------------------------------迷你
版----------------------------------------------------
<?php
$mysql_dbname = "php100";
mysql_connect("localhost", "root", "");
mysql_select_db($mysql_dbname);
$sql_list = mysql_list_tables($mysql_dbname);
while ($row_data = mysql_fetch_row($sql_list)) {
echo $row_data[0] . "<br>";
get_table_fd($row_data[0], "sql");
// $fp=fopen("sql/$tablename.sql","w+");
// fwrite($fp,$field);
// fclose($fp);
}
function get_table_fd($tablename) {
$field = "CREATE TABLE `$tablename`(\n";
$result = mysql_query("select * from $tablename");
while ($meta = mysql_fetch_field($result)) {
if ($meta->not_null)
$not_null = "not_null";
$field .= "`$meta->name` $meta->type($meta->max_length)
$not_null; \n";
}
$field .= ")\n";
return $field;
}
?>
-------------------------------------------------张恩明
版-----------------------------------------
<?php
//---需要设置的变量信息
$user = "admin";//系统管理员用户名
$pass = "e10adc3949ba59abbe56e057f20f883e";//该密码是md5
加密值,初始值为123456,密码格式也可以写成:$pass = md5
("123456");
$url = "http://localhost/PHP/";//网址设置,必须配置好该网址,否
则系统是会出错的噢!记得最后得有“/”
$lang = "gbk";//该功能是数据库要导入时,如果MYSQL高于4.0.x版
本时,需要设置的语言编码格式!呵呵~
//----从这里开始,您就不要去设置了噢!下面的信息无所谓的!
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbdata = "";
header("Content-type: text/html; charset=gbk");
error_reporting(E_ALL & ~E_NOTICE);
ob_start();
@set_time_limit(0);
function error($msg="",$url2="index.php")
{
global $url;
die("<script language=javascript>alert('友情提示:\\n\\n\\t".
$msg."\\n');location.href='".$url.$url2."'</script>");
return true;
}
function set_sql_cookie($act="backup")
{
global $url,$dbhost,$dbuser,$dbpass,$dbdata;
echo "<title>设置数据库信息 - PHP100备份系统</title>\n";
echo "<style type='text/css'>\nbody\n{\tbody:normal 14px '宋体
','Tahoma','Arial';\n}\n</style>\n";
echo "请设置好数据库服务器、账号、密码及数据库的名称等参数信
息!";
echo "<form method='post' action='".$url."index.php?act=".
$act."&set=cookie'>\n";
echo "服务器 <input type='text' name='db_host' value='".
$dbhost."' style='width:150px;height:20px;'><br />\n";
echo "账 号 <input type='text' name='db_user' value='".
$dbuser."' style='width:150px;height:20px;'><br />\n";
echo "密 码 <input type='password' name='db_pass'
value='".$dbpass."' style='width:150px;height:20px;'><br />\n";
echo "名 称 <input type='text' name='db_data' value='".
$dbdata."' style='width:150px;height:20px;'><br /><br />\n";
echo "<input type='submit' value='确认'> <input type='reset'
value='重置'></form>\n";
die();
return true;
}
function chk_get_set($act="backup")
{
global $url,$dbhost,$dbuser,$dbpass,$dbdata;
$db_host = $_POST["db_host"];
$db_user = $_POST["db_user"];
$db_pass = $_POST["db_pass"];
$db_data = $_POST["db_data"];
if(empty($db_host) || empty($db_user) || empty($db_data)) error
("数据库服务器、账号及数据库名称是不能为空","index.php?act=".
$act);
@mysql_connect($db_host,$db_user,$db_pass) or error("无法连
接到服务器上,请检查","index.php?act=".$act);
@mysql_select_db($db_data) or error("无法连接到数据库!请检查
!","index.php?act=".$act);
$msg = $act == "recover" ? "恢复" : "备份";
if($act == "backup" && !file_exists($db_data)) mkdir
($db_data);//创建数据库名称!
if($act == "recover" && !file_exists($db_data)) error("文件夹 ".
$db_data." 不存在!","index.php?act=".$act);
setcookie("qinggan_db",$db_host."___".$db_user."___".
$db_pass."___".$db_data);//设置服务器的COOKIE
@mysql_close();//关闭数据库连接
error("数据库信息已经配置完成,将进行下一步操作:\\n\\n\\t\\t".
$msg."数据!","index.php?act=".$act);
return true;
}
function sql_connect($cookie_db)
{
global $lang;
$dbarray = explode("___",$cookie_db);
mysql_connect($dbarray[0],$dbarray[1],$dbarray[2]);//连接信息
if(mysql_get_server_info()>"4.1") mysql_query("SET NAMES '".
$lang."'");
if(mysql_get_server_info()>"5.0.1") mysql_query("SET
sql_mode=''");
mysql_select_db($dbarray[3]);
return true;
}
function sql_query($sql="")
{
if(empty($sql)) return false;
$query = mysql_query($sql);
return $query;
}
function sql_fetch_array($query)
{
if(empty($query)) return false;
$rows = mysql_fetch_array($query);
return $rows;
}
function table2sql($table)
{
$tabledump = "DROP TABLE IF EXISTS ".$table.";\n";
$query = sql_query("SHOW CREATE TABLE ".$table);
$rows = sql_fetch_array($query);
$tabledump .= $rows[1].";\n\n";
return $tabledump;
}
function errmsg($msg="",$url2="index.php")
{
global $url;
echo "<script language="JavaScript">\nfunction moveNew()
{\nlocation.href="".$url.$url2."";\n}\nwindow.setTimeout
('moveNew()','2000');\n</script>";
echo $msg;
echo "<br /><br />";
echo "如果您的系统不支持跳转或系统长时间未跳转,请手动点击操
作!";
echo "<input type='button' onclick="window.location='".$url.
$url2."'" value='手动点击跳转'>";
die();
return true;
}
function read_msg($file)
{
if($handle=@fopen($file,"rb"))
{
$file_data=fread($handle,filesize($file));
fclose($handle);
}
return $file_data;
}
function recover_data($sql)
{
$sql=str_replace("\r","\n",$sql);
$sql_array=explode(";\n",$sql);
foreach($sql_array as $key=>$value)
{
$value = trim($value);
if($value == "#" || $value == "--")
{
$queryy = explode("\n",$value);
$value = '';
foreach($queryy as $v2)
{
if($v2[0]!='#') $value.=$v2;
}
}
if($value)
{
$value=trim(str_replace("\n","",$value));
if(get_cfg_var("magic_quotes_gpc")) stripslashes($value);
sql_query($value);
}
}
return true;
}
$cookie_chk = $_COOKIE["qinggan_userchk"];
$cookie_db = $_COOKIE["qinggan_db"];
if($cookie_chk)
{
if($cookie_chk != $user."___".md5($pass)) header("Location:".
$url."index.php");
}
$act = $_GET["act"] ? $_GET["act"] : $_POST["act"];
@$act_set = $_GET["set"];
if($act == "backup")
{
echo "<title>当前正在备份信息... - PHP100网站备份系统 -
www.PHP100.com</title>";
if(empty($cookie_chk)) error("需要用户验证账号和密码!");
if($act_set == "cookie") chk_get_set($act);
if(empty($cookie_db)) set_sql_cookie($act);
sql_connect($cookie_db);//连接数据库
$dbarray = explode("___",$cookie_db);
$table_list = mysql_list_tables($dbarray[3]);//列出所有表格
$table_count = mysql_num_rows($table_list);//呵呵获取表格总数
if(!file_exists($dbarray[3]."/".$dbarray[3].".sql"))
{
//-----备份数据表信息
$array = array();
for($i=0;$i<mysql_num_rows($table_list);$i++)
{
$table = mysql_tablename($table_list,$i);//
$array[$i] = table2sql($table);
}
$msg = implode("\n",$array);
$handle = fopen($dbarray[3]."/".$dbarray[3].".sql","wb");
if(!get_cfg_var("magic_quotes_gpc")) addslashes($msg);
fputs($handle,$msg);
fclose($handle);
unset($msg);
}
//-----表格
@$tableid = $_GET["tableid"] ? intval($_GET["tableid"]) : 0;
@$startid = $_GET["startid"] ? intval($_GET["startid"]) : 0;
@$pageid = $_GET["pageid"] ? intval($_GET["pageid"]) : 0;
//-----开始内容备份
if(($tableid+1)<$table_count)
{
$table = mysql_tablename($table_list,$tableid);
$query = sql_query("select count(*) as count from `".$table."`");
$num = sql_fetch_array($query);
$count = $num["count"];//获取个数
$per_size = 1000;//最大数不超过1000
if($count<$per_size) $per_size = $count;
if($count && $startid < $count)
{
$query = sql_query("select * from `".$table."` limit ".$startid.",".
$per_size);//
$numfields = mysql_num_fields($query);
$tabledump = "";
while($rows = mysql_fetch_row($query))
{
$tabledump .= "INSERT INTO $table VALUES (";
$comma = '';
for($i = 0; $i < $numfields; $i++)
{
$tabledump .= $comma.('\''.mysql_escape_string($rows[$i]).'\'');
$comma = ',';
}
$tabledump .= ");\n";
//---------------
$startid++;
if(strlen($tabledump)>(2048*1024))
{
$handle = fopen($dbarray[3]."/".$table."_".$pageid.".sql.","wb");
if(!get_cfg_var("magic_quotes_gpc")) addslashes($tabledump);
fputs($handle,$tabledump);
fclose($handle);
unset($tabledump);//清空内容!
errmsg("正在备份数据表 ".$table." 信息,当前已经写入第 ".
($pageid+1)." 页,即将写入第 ".($pageid+2)." 页信
息","index.php?act=backup&tableid=".$tableid."&startid=".
($startid)."&pageid=".($pageid+1));
}
}
//----
if($tabledump)
{
if($pageid>0)
{
@$msg = file_get_contents($dbarray[3]."/".$table."_".($pageid-
1).".sql");
if(strlen($msg) < (2048*1024))
{
$handle = fopen($dbarray[3]."/".$table."_".($pageid-
1).".sql","ab");
if(!get_cfg_var("magic_quotes_gpc")) addslashes($tabledump);
fputs($handle,$tabledump);
fclose($handle);
unset($tabledump,$msg);
$newpageid = $pageid;
}
else
{
$handle = fopen($dbarray[3]."/".$table."_".$pageid.".sql","wb");
if(!get_cfg_var("magic_quotes_gpc")) addslashes($tabledump);
fputs($handle,$tabledump);
fclose($handle);
unset($tabledump);
$newpageid = $pageid + 1;
}
}
else
{
$handle = fopen($dbarray[3]."/".$table."_".$pageid.".sql","wb");
if(!get_cfg_var("magic_quotes_gpc")) addslashes($tabledump);
fputs($handle,$tabledump);
fclose($handle);
unset($tabledump);
$newpageid = $pageid + 1;
}
}
if($startid<$count)
{
errmsg("正在备份数据表 ".$table." 信息。","index.php?
act=backup&tableid=".$tableid."&startid=".
($startid)."&pageid=".$newpageid);
}
else
{
//------
errmsg("数据表 ".$table." 信息已经备份完毕,将开始备份下一个数
据表!","index.php?act=backup&tableid=".($tableid+1));
}
}
else
{
errmsg("数据表 ".$table." 信息为空,将开始下一个数据表信息备
份","index.php?act=backup&tableid=".($tableid+1));
}
}
else
{
setcookie("qinggan_db","");//清空数据库COOKIE信息
setcookie("qinggan_userchk","");//清空用户验证信息
error("数据已经备份完毕!","index.php");
}
}
elseif($act == "recover")
{
echo "<title>恢复数据表信息 - PHP100网站备份系统 -
www.PHP100.com</title>";
if(empty($cookie_chk)) error("需要用户验证账号和密码!");
if($act_set == "cookie") chk_get_set($act);
if(empty($cookie_db)) set_sql_cookie($act);
sql_connect($cookie_db);//连接数据库
$dbarray = explode("___",$cookie_db);
$sql = read_msg($dbarray[3]."/".$dbarray[3].".sql");
recover_data($sql);
errmsg("数据表结构已经恢复,正在恢复数据信息!","index.php?
act=recover_data");
}
elseif($act == "recover_data")
{
echo "<title>恢复数据信息 - PHP100网站备份系统 -
www.PHP100.com</title>";
if(empty($cookie_chk)) error("需要用户验证账号和密码!");
if($act_set == "cookie") chk_get_set($act);
if(empty($cookie_db)) set_sql_cookie($act);
sql_connect($cookie_db);//连接数据库
$dbarray = explode("___",$cookie_db);
//-----
$table_list = mysql_list_tables($dbarray[3]);//列出所有表
$table_count = mysql_num_rows($table_list);//呵呵获取表总数
$tableid = $_GET["tableid"] ? intval($_GET["tableid"]) : 0;
$pageid = $_GET["pageid"] ? intval($_GET["pageid"]) : 0;
$table = mysql_tablename($table_list,$tableid);
if(($tableid+1)<$table_count)
{
if(!file_exists($dbarray[3]."/".$table."_".$pageid.".sql"))
{
errmsg("数据表 ".$table." 信息不存在或未曾备份!","index.php?
act=recover_data&tableid=".($tableid+1));
}
$sql = read_msg($dbarray[3]."/".$table."_".$pageid.".sql");
if($sql) recover_data($sql);
if(file_exists($dbarray[3]."/".$table."_".($pageid+1).".sql"))
{
errmsg("正在恢复数据表 ".$table." 信息","index.php?
act=recover_data&tableid=".$tableid."&pageid=".($pageid+1));
}
else
{
errmsg("已经恢复数据表 ".$table." 信息,将恢复下一个数据表信息
!","index.php?act=recover_data&tableid=".($tableid+1));
}
}
else
{
setcookie("qinggan_userchk","");
setcookie("qinggan_db","");
error("数据信息均已经恢复完毕!","index.php");
}
}
elseif($act == "check")
{
$chk_user = $_POST["chk_user"];
$chk_pass = $_POST["chk_pass"];
if(empty($chk_user) || empty($chk_pass)) error("账号或密码不能为
空");
if($chk_user != $user || md5($chk_pass) != $pass) error("账号或密
码不正确!");
setcookie("qinggan_userchk",$chk_user."___".md5($pass));//设置
cookie信息
?>
<title>选择操作项目 - PHP100网站备份系统 -
www.PHP100.com</title>
<style type="text/css">
body
{
font:normal 14px '宋体','Tahoma','Arial';
}
</style>
请选择您要操作的项目!<br /><br />
<input type="button" onclick="window.location='index.php?
act=backup'" value="备份数据"><br /><br />
<input type="button" onclick="window.location='index.php?
act=recover&iftable=yes'" value="恢复数据"><br />
<?php
}
else
{
setcookie("qinggan_userchk","");
setcookie("qinggan_db","");
?>
<title>验证账号 - PHP100网站备份系统 -
www.PHP100.com</title>
<style type="text/css">
body
{
font:normal 14px '宋体','Tahoma','Arial';
}
</style>
在操作之前您需要输入账号和密码进行身份确认!
<form method="post" action="index.php?act=check">
账号:<input type="text" name="chk_user"
style="width:150px;height:20px;"><br />
密码:<input type="password" name="chk_pass"
style="width:150px;height:20px;"><br /><br />
<input type="submit" value="确认"> <input type="reset"
value="重填"></form>
<?php
}
ob_end_flush();
?>
<br /><br />
备份原理:
<blockquote>
<li>一表一文件!<a href="http://www.php100.com">PHP100数
据库备份系统</a>
<li>单表文件大于2048K时,自动创建新文件!
<li>首次生成数据结构表!该表起总纲作用!
<li>同目前主流的备份程序不一样!本系统生成sql文件——是否兼容
phpmyadmin创建的表未验证!
</blockquote>
PHP备份数据库的原理和方法 57的更多相关文章
- Mysql备份数据库的一种方法
今天添加了一个数据库自动备份的模块,mysql数据备份的方法有很多,可以对单个数据库备份,可以多个数据库备份,也可以对某一个表进行备份,可以只备份数据库的结构不备份数据,可以根据需要做不同处理,正好现 ...
- 重新安装sqlyog时备份数据库链接列表的方法
一般在本机C:\Documents and Settings\Administrator\Application Data\SQLyog这个目录下有个sqlyog.ini文件.把这个文件备份一下就ok ...
- DM8数据库备份还原的原理及应用
(本文部分内容摘自DM产品技术支持培训文档,如需要更详细的文档,请查询官方操作手册,谢谢) 一.原理 1.DM8备份还原简介 1.1.基本概念 (1)表空间与数据文件 ▷ DM8表空间类型: ▷ SY ...
- Thinkphp3.2 备份数据库和还原数据的方法
其实Thinkphp框架并没有自带备份数据库的功能,但是细心的朋友可能会发现Thinkphp的一套内容管理系统oneThink是有备份数据库和还原数据的功能的. 所以今天我就来聊一聊,oneThink ...
- [整理] C#调用SQLDMO.DLL时间数据库备份 / 还原。 (香神无涯) // C#实现SQLSERVER2000数据库备份还原的两种方法 (带进度条)
/// <summary>/// 通过调用MSSQL的SQLDMO.DLL文件来实现备份数据库/// 1.首先在在项目中引用SQLDMO.DLL文件./// 2.在引用中的SQLDMO.D ...
- php备份数据库
php备份数据库原理和方法 原理 查找所有表 查找所有字段,列出所有字段名 字段类型等信息 查找所有数据 读取后注意特殊符号转换addslashes() 生成sql 把数据库格式化生成对应sql 相关 ...
- MySQL的备份的一些策略和方法的总结
1.一般使用的是mysqldump来进行备份,每次dump的数据是1000条,并且在这个过程中会进行锁表. (这种方式是逻辑备份,即直接将数据库中的数据导成sql语句进行备份的过程) 主要的使用方法: ...
- php备份数据库类分享
本文实例讲述了php实现MySQL数据库备份类.分享给大家供大家参考.具体分析如下:这是一个非常简单的利用php来备份mysql数据库的类文件,我们只要简单的配置好连接地址用户名与数据库即可 ph ...
- MSSQL·备份数据库中的单表
阅文时长 | 0.11分钟 字数统计 | 237.6字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·备份数据库中的单表』 编写人 | SCscHero 编写时间 | 20 ...
随机推荐
- VC++大数据量绘图时无闪烁刷屏技术实现(我的理解是,在内存上作画,然后手动显示,而不再直接需要经过WM_PAINT来处理了)
http://hantayi.blog.51cto.com/1100843/383578 引言 当我们需要在用户区显示一些图形时,先把图形在客户区画上,虽然已经画好但此时我们还无法看到,还要通过 程序 ...
- 《how to design programs》14章 再论自引用数据
这是一个家族谱: ;child(define-struct child (father mother name date eyes)) #lang racket ;child (define-stru ...
- 【模拟】Codeforces 706A Beru-taxi
题目链接: http://codeforces.com/problemset/problem/706/A 题目大意: 家的坐标在sx,sy,有n辆车,每辆车坐标xi,yi,速度vi,问最快的一辆车什么 ...
- JAVA中的Transient
Java中的transient,是用于声明序列化的时候不被存储的. 例子: package ThreadTest; /** * Created with IntelliJ IDEA. * User: ...
- Android 5.0 Lollipop初上手体验
在等了好几天还没有等到OTA升级提示,前天笔者给Nexus4线刷入了官方提供的Lollipop的镜像,在试用了这两天之后,现在总结下自己感觉很惊艳的地方和一些地方的吐槽.(点击图片可以查看大图) 1. ...
- C++编写ATM(2)
//上一个程序,密码不能被隐藏和该ATM可以让人取大于余额的乐币,这可定不行的.所以再次改了下,解决这两个问题. // ATM的初始.cpp : 定义控制台应用程序的入口点. // /******** ...
- Mysql 5.6主从同步配置与解决方案
主库IP:192.168.1.10 从库IP:192.168.1.11 centos的mysql配置文件在:/etc/my.cnf 1.主库配置编辑my.cnf: # 启用二进制日志 log_bin ...
- UVA1588(Kickdown)。
只需要固定长串,拿着短串移动就好了. 我是从右往左移动,需要注意的是要判断两头重叠部分(左端重叠和右端重叠)的大小关系. #include <iostream> #include < ...
- android api 中文 (73)—— AdapterView
前言 本章内容是android.widget.AdapterView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://androi ...
- 自己主动生成材质Material(Unity3D开发之十九)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/46854411 ...