我尝试使用内置的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);
脚本运行得很好。但问题出现在我无法恢复的时候。它是这样的:
因此我无法从CLI(mysql -u root -p dbname < db.sql
)和Navicat / Sequel Pro恢复它。
问题是,如何将其恢复到数据库? (请注意,VALUES之后没有引用)
答案 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)