为了避免叙述唐突,先介绍一下环境背景
项目开发链接的是公司局域网服务器上的数据库,经常需要从此数据库打包数据交给领导,数据库用的是PostgreSQL,而且以前没有接触过使用dmp格式来备份数据。这次研究了一下,但是踩到了许多坑,上网查询前辈们的经验也是只言片语。不过好在最终把问题解决了,在这里将自己的方法和前辈们的经验汇总一下,方便有踩到同样坑的朋友参考。
下面开始正文
一开始我是从数据库管理工具
Navicat
和pgAdmin
上寻找导出数据的办法,折腾一番后数据可以导出,但就是没有dmp格式的。后来经过上网查询,前辈们说PostgreSQL自带的pg dump
可以完成这个任务,但,pg dump
到底是什么?在哪?怎么用?网上的大神前辈们几乎不屑去描述这些小问题,所以这是我的第一步:找到所谓的pg dump
。如果你的PC上安装了PostgreSQL,请找到你的安装目录,然后在安装目录下找到
bin
目录,仔细找找看,是不是有个可执行文件叫pg_dump.exe
呢?别忙点开它,不是直接双击来用它。
我的Windows 10系统下,所述路径为:C:\Program Files\PostgreSQL\9.6\bin,切合你自己的实际系统环境,找一找吧。pg dump
找到了,现在的问题是怎么去执行它,网上的资料说用命令行。我试过用PostgreSQL自带的
SQL Shell
,在里面键入命令去执行,但是不行。原因可能是pg_dump是可执行程序,在sql shell下不能用(大牛别笑,像我们这些菜鸟真的不懂)
后来想到了用Windows的cmd去执行,然而这才是正确方法。打开cmd,键入正确的路径,运行
pg_dump.exe
可执行文件,命令如下,各位根据自己系统环境路径自行尝试C:\Users\Windows10>cd C:\Program Files\PostgreSQL\9.6\bin C:\Program Files\PostgreSQL\9.6\bin>pg_dump.exe
坑一:执行步骤3以后,cmd报错如下:
C:\Program Files\PostgreSQL\9.6\bin>pg_dump.exe 口令:
这个
口令
来的突然,哪里的口令?数据库连接密码?Windows登陆密码?在尝试了各种密码后,cmd报了N种错误……pg_dump: [归档 (db)] 与数据库 "Windows10" 联接失败: 致命错误: 用户 "Windows10" Password 认证失败 pg_dump: [归档 (db)] 与数据库 "Windows10" 联接失败: fe_sendauth: no password supplied pg_dump: [归档 (db)] 与数据库 "shopDemo" 联接失败: 致命错误: 用户 "postgres" Password 认证失败 pg_dump: [归档 (db)] 与数据库 "shopDemo" 联接失败: fe_sendauth: no password supplied
最终解决办法:不去管这个口令是什么鬼,它其实是MD5的验证。我们找到同样在PostgreSQL安装目录下的
data
文件夹,里面有一个文件叫pg_hba.conf
,用记事本打开它,找到最后几行,将MD5替换成trust。代码如下:
修改前的代码:
……
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 MD5
# IPv6 local connections:
host all all ::1/128 MD5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host replication postgres 127.0.0.1/32 MD5
#host replication postgres ::1/128 MD5
修改后的代码:
……
# TYPE DATABASE USER ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#host replication postgres 127.0.0.1/32 trust
#host replication postgres ::1/128 trust
5.口令的问题解决了,现在我们要开始从数据库中导出我们想要的数据了,命令如下:
C:\Program Files\PostgreSQL\9.6\bin>pg_dump -h 192.168.1.12 -p 5432 -U postgres -d shopDemo -t project_shop_girl > /project_shop_girl.dmp
/* -h:远程连接地址,如果你连接本机数据库,就不用写它 */
/* -p:端口号,同上 */
/* -U:数据库登陆用户名 */
/* -d:连接的数据库名字 */
/* -t:具体要导出哪张表 */
/* > :文件保存路径,上述代码表示要存在当前路径下 */
结果悲剧了:
C:\Program Files\PostgreSQL\9.6\bin>pg_dump -h 192.168.1.12 -p 5432 -U postgres -d shopDemo -t project_shop_girl > project_shop_girl.dmp
拒绝访问。
原因:当前路径无权访问,所以文件存不进去(觉得是Windows作的妖)
解决办法:换个路径存,最好是非系统盘,这样也好找,基本权限也足够,大不了手动再移动呗
C:\Program Files\PostgreSQL\9.6\bin>pg_dump -h 192.168.1.12 -p 5432 -U postgres -d shopDemo -t project_shop_girl > F:/project_shop_girl.dmp
6.如果在过程中报错数据库 "shopDemo" 不存在
,先看看是不是粗心打错数据库名字了,又或者是没用-h
定义远程数据库,访问的是你本地的127.0.0.1
吧,而你本地没有该数据库。.
以上是我在工程中遇到的又一个不会的地方。遇到了、解决了,记录下来,算是又涨了些姿势。记录过程中,有些名词、文字并不规范,甚至不正确,不符合官面儿语言,但你能看懂么?能看懂就比拗口的书面语言强。解决办法不是我发明的,我也是上网借鉴各路大牛们的经验和方法,用白话加以整理和说明,因为大牛们虽然多,但是像我这样的菜鸟也不少,菜鸟间的语言,只可意会不可言传。哈哈。
最后:
感谢 https://blog.csdn.net/6rl/article/details/4667522 大牛
感谢 https://blog.csdn.net/windone0109/article/details/12748789 大牛
感谢 百度知道 的不知名 大牛