在postgreSQL中运行sql脚本和pg_restore命令方式
今天踩坑了,把powerdesign生成的sql脚本文件,用pg_restore命令一直运行。。。
过程惨不忍睹,一直以为是编码问题,修改了serve和client的encoding,结果。。。
记录一下这个错误:
postgreSQL运行sql脚本文件:
psql-ddbname-Uusername-f(脚本所在位置).sql
postgerSQL的pg_restore命令
用法:
pg_restore[选项]…[文件名]
一般选项:
-d,--dbname=名字连接数据库名字 -f,--file=文件名输出文件名 -F,--format=c|d|t备份文件格式(应该自动进行) -l,--list打印归档文件的TOC概述 -v,--verbose详细模式 -V,--version输出版本信息,然后退出 -?,--help显示此帮助,然后退出
恢复控制选项:
-a,--data-only只恢复数据,不包括模式 -c,--clean在重新创建之前,先清除(删除)数据库对象 -C,--create创建目标数据库 -e,--exit-on-error发生错误退出,默认为继续 -I,--index=NAME恢复指定名称的索引 -j,--jobs=NUM执行多个并行任务进行恢复工作 -L,--use-list=FILENAME从这个文件中使用指定的内容表排序
输出
-n,--schema=NAME在这个模式中只恢复对象 -N,--exclude-schema=NAME不恢复此模式中的对象 -O,--no-owner不恢复对象所属者 -P,--function=NAME(args)恢复指定名字的函数 -s,--schema-only只恢复模式,不包括数据 -S,--superuser=NAME使用指定的超级用户来禁用触发器 -t,--table=NAME恢复命名关系(表、视图等) -T,--trigger=NAME恢复指定名字的触发器 -x,--no-privileges跳过处理权限的恢复(grant/revoke) -1,--single-transaction作为单个事务恢复 –disable-triggers在只恢复数据的过程中禁用触发器 –enable-row-security启用行安全性 –if-exists当删除对象时使用IFEXISTS –no-comments不恢复注释 –no-data-for-failed-tables对那些无法创建的表不进行
数据恢复
–no-publications不恢复发行 –no-security-labels不恢复安全标签信息 –no-subscriptions不恢复订阅 –no-tablespaces不恢复表空间的分配信息 –section=SECTION恢复命名节(数据前、数据及数据后) –strict-names要求每个表和(或)schema包括模式以匹配至少一个实体 –use-set-session-authorization 使用SESSIONAUTHORIZATION命令代替 ALTEROWNER命令来设置所有权
联接选项:
-h,--host=主机名数据库服务器的主机名或套接字目录 -p,--port=端口号数据库服务器的端口号 -U,--username=名字以指定的数据库用户联接 -w,--no-password永远不提示输入口令 -W,--password强制口令提示(自动) –role=ROLENAME在恢复前执行SETROLE操作
选项-I,-n,-N,-P,-t,-T,以及--section可以组合使用和指定
多次用于选择多个对象.
希望不要和我一样犯这个低级错误
顺便记录一下查看server和client的encoding以及修改
找到postgresql.conf文件,修改参数lc_messages的值为UTF8
重启PostgreSQL的服务。
----查看服务端字符集:
test=>showserver_encoding;
—查看客户端字符集:
test=>showclient_encoding;
补充:pg_restore及psql恢复数据的用法
一、使用psql恢复SQL文本格式的数据备份(即一个包含SQL脚本的文本文件)
恢复一个SQL备份文件并忽略过程中可能发生的所有错误:
psql-Upostgres-fmyglobals.sql
恢复一个SQL备份文件,如遇任何错误则立即停止恢复:
psql-Upostgres--setON_ERROR_STOP=ON-fmyglobals.sql
将SQL文本中的数据恢复到某个指定的database:
psql-Upostgres-dmydb-fselect_objects.sql
二、使用pg_restore进行恢复
功能:
(1)支持并行恢复,使用-j选项可以控制并行恢复的线程数。多个恢复线程可以并行处理,每个线程处理一张表。该模式可以显著提高恢复速度。
(2)可以使用pg_restore扫描备份文件来生成一张备份内容列表,通过该列表可以确认备份红包含了哪些内容。还可以通过编辑该内容列表来控制恢复哪些内容。
(3)pg_dump支持选择性地仅备份部分对象以节省备份时间,类似的,pg_restore也支持选择性的仅恢复部分对象,不管备份文件本身是全库备份还是部分对象的备份都没有问题。
(4)pg_restore的大部分功能是向后兼容的,即支持将老版本PostgreSQL生产的备份数据恢复到新版本的PostgreSQL中。
在使用pg_restore执行恢复动作之前,请先创建目标数据库:
createdatabasemydb;
然后执行恢复:
pg_restore--dbname=mydb--jobs=4--verbosemydb.backup
如果备份和恢复时使用的database同名,则可以通过加--create选项省去单独建库的过程,如下:
pg_restore--dbname=postgres--create--jobs=4--verbosemydb.backup
注:如果指定了--create选项,那么恢复出来的数据库名就会默认采用备份时的数据库名,不允许改名。如果还同时指定了--dbname选项,那么此时连接的数据库名一定不能是待恢复的数据库名,因为要恢复数据库之前必然要建数据库,而
要建数据库之前必然要先连到某个已存在的数据库,--dbname选项指定的就是建立被恢复的数据库之前先连到哪个数据库,所以必然不能与待恢复的数据库同名,我们一般指定先连到postgres数据库。
9.2版或更新版本的pg_restore支持--section选项,加上该选项后可以实现仅恢复表结构而不恢复表数据。具体做法是先创建目标恢复数据库:
createdatabasemydb2;
然后使用pg_restore:
pg_restore--dbname=mydb2--section=pre-data--jobs=4mydb.backup
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。