PHP/thinkPHP 备份恢复mysql数据库
时间:2023-1-11 16:14 作者:六度科技 分类: PHP
thinkphp处本人有修BUG
1.PHP导出
代码如下(示例):
//配置信息
$cfg_dbhost = 'localhost';
$cfg_dbname = 'xxx';
$cfg_dbuser = 'root';
$cfg_dbpwd = 'root';
$cfg_db_language = 'utf8';
$to_file_name = "xxx.sql"; //导出文件名
//链接数据库
$link = mysqli_connect($cfg_dbhost,$cfg_dbuser,$cfg_dbpwd,$cfg_dbname);
//编码方式
mysqli_query($link,"set names ".$cfg_db_language);
//查询数据库中所有表名,并保存在数组中
$tables = mysqli_query($link,"SHOW TABLES");
while($row = mysqli_fetch_array($tables)){
$tabList[] = $row[0];
}
//将每个表的表结构导出到文件
foreach($tabList as $val){
$sql = "show create table ".$val;
$res = mysqli_query($link,$sql);
$row = mysqli_fetch_array($res);
$info = "-- ----------------------------\r\n";
$info .= "-- Table structure for `".$val."`\r\n";
$info .= "-- ----------------------------\r\n";
$info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
$sqlStr = $info.$row[1].";\r\n\r\n";
//把$info写入文件,文件不存在则创建
file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
//释放资源
mysqli_free_result($res);
}
//将每个表的数据导出到文件
foreach($tabList as $val){
$sql = "select * from ".$val;
//若只需导出指定数据
// switch($val){
// case '表名':
// $sql = "select * from ".$val." where 条件;
// break;
// default:
// $sql = "select * from ".$val;
// }
$res = mysqli_query($link,$sql);
//如果表中没有数据,则跳出循环
if(mysqli_num_rows($res)<1) continue;
$info = "-- ----------------------------\r\n";
$info .= "-- Records for `".$val."`\r\n";
$info .= "-- ----------------------------\r\n";
file_put_contents($to_file_name,$info,FILE_APPEND);
//读取数据
while($row = mysqli_fetch_row($res)){
$sqlStr = "INSERT INTO `".$val."` VALUES (";
foreach($row as $zd){
$sqlStr .= "'".$zd."', ";
}
//去掉最后一个逗号和空格
$sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
$sqlStr .= ");\r\n";
file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
}
//释放资源
mysqli_free_result($res);
file_put_contents($to_file_name,"\r\n",FILE_APPEND);
}
2.ThinkPHP框架导出
代码如下(示例):
//设置文件名
$to_file_name = "./updata/".date("Y-m-d_H-i-s").".sql";
//获取表名列表
$tabList = Db::connect()->getTables();
//将每个表的表结构导出到文件
foreach ($tabList as $val) {
$sql = "show create table `" . $val . "`";
$res = Db::query($sql);
$info = "-- ----------------------------\r\n";
$info .= "-- Table structure for `" . $val . "`\r\n";
$info .= "-- ----------------------------\r\n";
$info .= "DROP TABLE IF EXISTS `" . $val . "`;\r\n";
$sqlStr = $info . $res[0]['Create Table'] . ";\r\n\r\n";
//追加到文件
file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
}
//将每个表的数据导出到文件
foreach ($tabList as $val) {
$sql = "select * from `" . $val . "`";
$res = Db::query($sql);
//如果表中没有数据,则跳出循环
if (count($res) < 1) continue;
$info = "-- ----------------------------\r\n";
$info .= "-- Records for `" . $val . "`\r\n";
$info .= "-- ----------------------------\r\n";
file_put_contents($to_file_name, $info, FILE_APPEND);
//读取数据
foreach ($res as $v) {
$sqlStr = "INSERT INTO `" . $val . "` VALUES (";
foreach ($v as $zd) {
$sqlStr .= "'" . $zd . "', ";
}
//去掉最后一个逗号和空格
$sqlStr = substr($sqlStr, 0, strlen($sqlStr) - 2);
$sqlStr .= ");\r\n";
file_put_contents($to_file_name, $sqlStr, FILE_APPEND);
}
file_put_contents($to_file_name, "\r\n", FILE_APPEND);
}
3.PHP恢复
// 连接数据库
$link=@new mysqli("{$data['DB_HOST']}:{$data['DB_PORT']}",$data['DB_USER'],$data['DB_PWD']);
// 获取错误信息
$error=$link->connect_error;
if (!is_null($error)) {
// 转义防止和alert中的引号冲突
$error=addslashes($error);
die("<script>alert('数据库链接失败:$error');history.go(-1)</script>");
}
// 设置字符集
$link->query("SET NAMES 'utf8'");
$link->server_info>5.0 or die("<script>alert('请将您的mysql升级到5.0以上');history.go(-1)</script>");
// 创建数据库并选中
if(!$link->select_db($data['DB_NAME'])){
$create_sql='CREATE DATABASE IF NOT EXISTS '.$data['DB_NAME'].' DEFAULT CHARACTER SET utf8;';
$link->query($create_sql) or die('创建数据库失败');
$link->select_db($data['DB_NAME']);
}
// 导入sql数据并创建表
$bjyadmin_str=file_get_contents('./admin.sql');
$sql_array=preg_split("/;[\r\n]+/", str_replace('admin_',$data['DB_PREFIX'],$bjyadmin_str));
foreach ($sql_array as $k => $v) {
if (!empty($v)) {
$link->query($v);
}
}
$link->close();
4.thinkphp恢复
//得到文件路径
$filename='./updata/'.input('get.filename');
// 导入sql数据并创建表
$bjyadmin_str=file_get_contents($filename);
$sql_array=preg_split("/;[\r\n]+/", $bjyadmin_str);
foreach ($sql_array as $k => $v) {
if (!empty($v)) {
Db::query($v);
}
}