CI数据库备份与还原入门小例子
本帖最后由 ywqbestever 于 2010-8-23 09:09 编辑最近看到有几个问CI数据库备份与还原的问题,以前也没做过还原的问题,就此探讨一下:我的思路:
使用CI的数据库工具类进行数据库备份,写入一个SQL文件中,恢复时,用CI的文件辅助函数读取文件内容进行query操作。
代码:
function backup(){ function backup(){
$this->load->dbutil();
$this->load->helper('file');
$prefs = array(
'tables' => array(),// 包含了需备份的表名的数组.
'ignore' => array(), // 备份时需要被忽略的表
'format' => 'txt', // gzip, zip, txt
'filename' => 'mybackup.sql', // 文件名 - 如果选择了ZIP压缩,此项就是必需的
'add_drop' => TRUE, // 是否要在备份文件中添加 DROP TABLE 语句
'add_insert'=> TRUE, // 是否要在备份文件中添加 INSERT 语句
'newline' => "\\n" // 备份文件中的换行符
);
$backup = $this->dbutil->backup($prefs);
write_file('./database.sql', $backup);
}
function restore(){
$this->load->helper('file');
//$content = read_file('./database.sql');
//$content = preg_replace("/#(.*)\\s#(.*)TABLE(.*)(.*)\\s#/i","",$content);//去掉注释部分
$conn=mysql_connect("localhost","root","");//指定数据库连接参数
mysql_select_db("test");
$file = BASEPATH . "database.sql";
mysql_query("source '".$file."';");
mysql_close($conn);
/*$sqls = explode(";\\r",$content);
foreach($sqls as $sql){
if(str_replace(" ","",$sql)){
$this->db->query($sql);
}
}*/
}
恢复的函数中注释的部分,是想尝试使用CI的数据库进行导入的,结果发现直接query文件中的内容不行
然后去掉CI备份文件中的注释部分,发现依然不可以,接着进行打散SQL语句,然后一条一条query,是可以的。
最后用原始的函数是可以完美进行的,而且不用去掉注释部分。
大家有啥好的方法欢迎发出来分享啊
:)
case 'add':
//生成数据库备份
$this->load->helper('string');
$this->load->dbutil();
$prefs = array(
'ignore' => array($this->db->dbprefix('ci_sessions')),
'format' => 'txt'
);
$backup = $this->dbutil->backup($prefs);
$this->load->helper('file');
write_file($bak_dir.$this->db->database.'_'.date('Ymd').'_'.random_string('alnum', 8).'.sql', $backup);
$data['mes']="备份成功!";
$data['backurl']= base_url('/set/backup');
$this->load->view('templates/note',$data);
break;
case 'recover': //恢复指定数据库
$this->load->helper('file');
$this->load->helper('string');
$file = $bak_dir.$id; //.sql文件实际地址
//数据库信息
$host = $this->db->hostname;
$user = $this->db->username;
$pwd= $this->db->password;
$db = $this->db->database;
$string = read_file($file);
$mysqli = new mysqli($host,$user,$pwd,$db);
$mysqli->set_charset("utf8");
$result = $mysqli->multi_query($string);
$mysqli->close();
if($result){
$data['mes']="数据库恢复成功!";
} else{
$data['mes']="数据库恢复失败!";
}
$data['backurl']= base_url('/set/backup');
$this->load->view('templates/note',$data);
break;
豪气东来 发表于 2017-6-14 16:14
上面的方法,只是备份默认的数据库test,如何备份需要指定的数据库了?
$mysqli = new mysqli($host,$user,$pwd,$db);
将这几个参数改成你要备份的数据库相关信息就好了 上面的方法,只是备份默认的数据库test,如何备份需要指定的数据库了? 'newline' => "n"
'newline' => "\n"? 回复 2# snllll
\n哈,这个编辑器自动给去掉了 关注.是 围观学习中 :):handshake 这样做好还是让服务器管理员写定时备份命令好? 占个位置,收藏了。 执行mysql_query("source '".$file."';"); 时候,报
I nvalid query: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source 'D:/www/local/didi/system/database.sql'' at line 1
错误 ,是什么原因呢 我用自带的数据库工具备份不成功,纠结。