从Codeigniter备份还原数据库

时间:2017-12-06 03:53:24

标签: php mysql codeigniter

我尝试使用内置的CodeIgniter $this->dbutil->backup()进行自动数据库备份。

脚本是:

    $this->load->dbutil();

    $backup = $this->dbutil->backup(array(
        'tables'        => array(),   // Array of tables to backup.
        'ignore'        => array('regencies', 'villages', 'provinces'),                     // List of tables to omit from the backup
        'add_drop'      => TRUE,                        // Whether to add DROP TABLE statements to backup file
        'add_insert'    => TRUE,                        // Whether to add INSERT data to backup file
        'newline'       => "\n"                         // Newline character used in backup file
    ));

    $this->load->helper('file');

    $latest = md5(uniqid());

    write_file(APPPATH . 'backup/'. $latest .'.gz', $backup);

脚本运行得很好。但问题出现在我无法恢复的时候。它是这样的:

sql result of the codeigniter backup

因此我无法从CLI(mysql -u root -p dbname < db.sql)和Navicat / Sequel Pro恢复它。

restore database from cli

问题是,如何将其恢复到数据库? (请注意,VALUES之后没有引用)

2 个答案:

答案 0 :(得分:0)

这是一个简单的SQL语法问题。字符串文字需要用单引号括起来。

INSERT INTO `foo` (`bar`,`bell`) VALUES ( Hey diddle diddle , cat and fiddle )

不起作用。我们需要

INSERT INTO `foo` (`bar`,`bell`) VALUES ('Hey diddle diddle','cat and fiddle')
                                         ^-----------------^ ^--------------^

仔细查看您尝试执行的实际SQL语句。

您的“卸载程序”需要更加智能,将字符串和日期值放入SQL语句时将其括在单引号中。 (为方便起见,数字文字也可以用单引号括起来,因此您不需要区分,只需将VALUES列表中的所有值用单引号括起来。

还要注意当值包含单引号时会发生什么。例如:

 ... VALUES ( 'O'Leary' , ... 
              ^_^     

这也将是一个错误。值中的单引号将需要转义。在MySQL中执行此操作的一种方法是在单引号之前添加另一个单引号,如下所示:

 ... VALUES ( 'O''Leary' , ... 
              ^--------^

这将是有效的,并将评估为包含单个引用O'Leary

的字符串

此外,MySQL会将字符串文字中的反斜杠字符解释为转义字符。例如:

 ... VALUES ( 'this probably \not what we want' , 
                             ^^       

该序列\n将被解释为换行符,而不是字符n。因此,反斜杠字符也需要转义。

等人

答案 1 :(得分:0)