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 相关文章推荐
我的论坛源代码(四)
Oct 09 PHP
PHP新手上路(九)
Oct 09 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
pdo中使用参数化查询sql
Aug 11 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 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
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
2017/03/12 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
你所不了解的javascript操作DOM的细节知识点(一)
2015/06/17 Javascript
jquery实现的V字形显示效果代码
2015/10/27 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
Python基础中所出现的异常报错总结
2016/11/19 Python
名片管理系统python版
2018/01/11 Python
python实现外卖信息管理系统
2018/01/11 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
基于Django统计博客文章阅读量
2019/10/29 Python
详解Python实现进度条的4种方式
2020/01/15 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
Pycharm Git 设置方法
2020/09/15 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
保护环境的宣传语
2015/07/13 职场文书
Python基础之Socket通信原理
2021/04/22 Python