我尝试使用以下命令将数据库导入postgres:
public function get_class_name()
{
$id=$this->input->post('c');
echo json_encode($id);
}
精美的手册说:
- 无表空间
不要输出命令来选择表空间。使用此选项,将在还原期间的任何表空间中创建所有对象。
我认为这意味着我不必创建名称空间,转储起始点。由于导入失败,
"C:\Program Files\PostgreSQL\9.5\bin\pg_restore.exe" --dbname=postgres --clean --create --format=d --jobs=16 --no-tablespaces --host=localhost --username=postgres "S:\Directory-Dump_Inn"
我猜,这个假设是错误的。那么手册中的解释是什么意思呢? 如果我事先创建表空间,导入工作正常。
编辑:导入服务器版本为9.5.4,导出服务器版本为9.6.3。可能导出命令也很重要:
ERROR: tablespace "ts_inn" does not exist
导出是否遗漏了"C:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe" --host localhost --port 5432 --username "postgres" --no-password --format directory --section pre-data --section data --section post-data --compress 0 --jobs 4 --verbose --file "F:\Postgres-Backup\Directory-Dump_Inn" "inn" 2>> %logfile%
的罪魁祸首?如果是,如果我将--no-tablespaces
作为参数添加到pg_dump,那么为什么我会在导入期间使用--no-tablespaces
?显然,转储文件中不会有任何--no-tablespaces
。
答案 0 :(得分:1)
2016年9月在this提交中修复了与您的问题非常相似的问题以修复bug #14315,因此请确保您拥有PostgreSQL 9.5或更高版本的最新修补程序。
但即使使用这些补丁,您的示例也会失败,因为您没有将--no-tablespaces
添加到pg_dump
的调用中。
这有点令人惊讶,但是为了抑制转储中TABLESPACE
的{{1}}子句,仅仅调用CREATE DATABASE
是不够的。必须使用该选项创建转储。