linux php mysql数据库备份实现代码


Posted in PHP onMarch 10, 2009

但是出现了问题:
第一、运行php的是apche的用户,比如是nobody,那么它一般是没有权限访问/usr/local/mysql/data目录的
第二、就算能够访问,那么你如何能够把/usr/local/mysql/data目录下的文件拷贝出来呢?因为mysql在运行的时候是不运行访问的,那么nobody用户有权限停止mysql的服务,不可能!
越想越不对劲,没有办法,看能不能从php操作数据库入手,于是就去看了下phpMyadmin和Discuz!的代码,呵呵,于是偷抄了Discuz!的代码,形成了如下备份数据库的方法。(在这里感谢Discuz!的开发者)

备份数据库有两种方式,一种是只备份数据库的结构,一种把是结构和所有的数据都备份出来,当然是第二种方法好啦,不过我为了考虑可能的需求就都作啦。

/****** 备份数据库结构 ******/

/*
函数名称:table2sql()
函数功能:把表的结构转换成为SQL
函数参数:$table: 要进行提取的表名
返 回 值:返回提取后的结果,SQL集合
函数作者:heiyeluren
*/

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;
}

/****** 备份数据库结构和所有数据 ******/
/*
函数名称:data2sql()
函数功能:把表的结构和数据转换成为SQL
函数参数:$table: 要进行提取的表名
返 回 值:返回提取后的结果,SQL集合
函数作者:heiyeluren
*/
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()函数,这是一个生成随机码的函数,详细可以参考:
// https://3water.com/article/17423.htm

// 获取数据库结构和数据内容
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("数据成功备份至服务器 <a href=\"$filename\">$filename</a> 中。");
}
}
else
{
exit_msg("无法打开你指定的目录". $filename .",请确定该目录是否存在,或者是否有相应权限");
}
}
else
{
exit_msg("您没有输入备份文件名,请返回修改。");
}
}
// 保存到服务器结束
}
else
{
exit_msg("数据表没有任何内容");
}

/* 备份数据库结束 */

呵呵,基本上这样就结束了,然后涉及到的一个问题是如何把数据恢复到数据库中,我想这个是不复杂的,但是最好能够满足有从客户端和从服务器恢复数据的功能。

PHP 相关文章推荐
Windows下的PHP5.0安装配制详解
Sep 05 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
php 强制下载文件实现代码
Oct 28 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
PHP检测字符串是否为UTF8编码的常用方法
Nov 21 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
PHP代码优化技巧小结
Sep 29 PHP
Yii隐藏URL中index.php的方法
Jul 12 PHP
Zend Framework框架中实现Ajax的方法示例
Jun 27 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
Apr 13 PHP
php生成SessionID和图片校验码的思路和实现代码
Mar 10 #PHP
php 数组的创建、调用和更新实现代码
Mar 09 #PHP
在JavaScript中调用php程序
Mar 09 #PHP
隐性调用php程序的方法
Mar 09 #PHP
php动态生成JavaScript代码
Mar 09 #PHP
Zend 输出产生XML解析错误
Mar 03 #PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
Mar 03 #PHP
You might like
Zerg基本策略
2020/03/14 星际争霸
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
JavaScript读取中文cookie时的乱码问题的解决方法
2009/10/14 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
详解在Python中处理异常的教程
2015/05/24 Python
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
PyQT实现多窗口切换
2018/04/20 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
python django生成迁移文件的实例
2019/08/31 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
大专生工程监理求职信
2013/10/04 职场文书
大学自主招生自荐信
2013/12/16 职场文书
初婚未育证明
2014/01/15 职场文书
授权委托书(完整版)
2014/09/10 职场文书
商务邀请函
2015/01/30 职场文书
夏洛特的网观后感
2015/06/15 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang
volatile保证可见性及重排序方法
2022/08/05 Java/Android