省去让运维从线上服务器下载sql文件的麻烦

sql内容

运行sql文件,把线上数据库导入到本地,那不外乎3步
1.检查数据库表是否存在
2.创建数据表(结构)
3.插入数据

检测是否存在表并创建

1
2
3
4
5
6
DROP TABLE IF EXISTS `table`;
CREATE TABLE `table` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL COMMENT '名称',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

插入数据

1
2
3
4
INSERT INTO `table` 
VALUES
('1', 'admin'),
('2', 'editor');

需要的sql语句差不多就这些,用php开始拼接

PHP拼接sql语句

php部分没用原生,用的TP5框架

  • 创建文件

    1
    2
    3
    4
    5
    6
    //创建文件的名称
    $to_file_name = 'mitrade-cms.sql';
    //判断文件是否存在,存在删除
    if(file_exists($to_file_name)){
    @unlink($to_file_name);
    }
  • 数据库表生成数组
    $this->dbname = 'mitrade_cms';

    1
    2
    3
    4
    5
    6
    7
    8
    $rs = Db::query("SHOW TABLES FROM $this->dbname");

    $list = array();
    foreach($rs as $val){
    $list[] = $val['Tables_in_'.$this->dbname];
    }
    //返回数组
    $tableList = $list;
  • 根据前两步的操作得到了数据库表名数组 进行拼接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$info = "-- ----------------------------\r\n";
$info .= "-- 日期:".date("Y-m-d H:i:s",time())."\r\n";
$info .= "-- ----------------------------\r\n\r\n";
file_put_contents($to_file_name,$info,FILE_APPEND);
//crate 语句
foreach($tableList as $val){
$sql = "show create table ".$val;
$row = $this->show_createtable($sql);
$info = "-- ----------------------------\r\n";
$info .= "-- Table structure for `".$val."`\r\n";
$info .= "-- ----------------------------\r\n";
$info .= "DROP TABLE IF EXISTS `".$val."`;\r\n";
$sqlStr = $info.$row.";\r\n\r\n";
//追加到文件
file_put_contents($to_file_name,$sqlStr,FILE_APPEND);

}
  • 生成插入语句
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

foreach($tableList as $val){
$sql = 'select * from '.$val;
$data = Db::query($sql);
$info = "-- ----------------------------\r\n";
$info .= "-- Records for `".$val."`\r\n";
$info .= "-- ----------------------------\r\n";
file_put_contents($to_file_name,$info,FILE_APPEND);
//数据插入'

$row = $data;
if(!empty($row)){
$sqlStr = "INSERT INTO `".$val."` VALUES ";

foreach($row as $zd){

$sqlStr = $sqlStr.' (';
foreach ($zd as $v){
if(empty($v)){$v=0;}
$v = str_replace("'","\'",$v);
$sqlStr .= "'".$v."', ";
}
//去掉最后一个逗号和空格
$sqlStr = substr($sqlStr,0,strlen($sqlStr)-2);
$sqlStr .= "),\r\n";
}
$sqlStr = substr($sqlStr,0,strlen($sqlStr)-3);
$sqlStr .= ";\r\n";
file_put_contents($to_file_name,$sqlStr,FILE_APPEND);
}
}

生成插入语句的时候要注意把’ 单引号转义,不然导入数据库要报错

发起下载

先判断文件是否生成成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
if(!file_exists($to_file_name))

{

echo "下载文件不存在!";
exit;

}

$file_size = filesize($to_file_name);

Header("Content-type: application/octet-stream");

Header("Accept-Ranges: bytes");

Header("Accept-Length:".$file_size);

Header("Content-Disposition: attachment; filename=".$to_file_name);
@readfile($to_file_name);
exit;

到这里就完成了下载数据库sql文件的过程了。