postgresql实用操作记录

  pgsql已经更新到beta11了,不同版本的服务器启动或相关命令、配置可能会有不同,所以得根据pg版本进行操作。下面记录一些工作中常用到的一些操作

本文环境:

postgres : v10.3

os: MAC

虽然已经在kong部署中介绍了postgres的部署,为了行文连贯性,这里再简单记录下pg的启动相关命令。

服务启动

安装

brew install postgresql 
which psql
~$ /usr/local/bin/psql

执行安装命令后,会连带安装很多有用的pg命令如pg_ctl , postgres, psql等等

启动pg服务

pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

这里指定了启动的目录,因为pg默认安装在/usr/local/var/postgres目录下,也可以直接实用pg_ctl start来启动,但是必须设置环境变量PGDATA=/usr/local/var/postgres,否则会报错

$ pg_ctl start
pg_ctl: no database directory specified and environment variable PGDATA unset
Try "pg_ctl --help" for more information.

注意:

不同版本启动方式可能不同,在linux上pg v9.5的启动如下:

systemctl start postgresql-9.5.service

或
service postgresql start

常用命令

查看版本

pg_ctl -V

查看数据库状态、操作

#启动数据库
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

#日志路径
cat /usr/local/var/postgres/server.log

#查看数据库状态
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log status 

#停止
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log stop -s -m fast 

#查看数据库进程
ps -ef |grep postgres 或 ps auxwww | grep postgres  

创建数据库用户

createuser test_user -P

创建数据库/密码

createdb db_name -O db_pwd  -E UTF8 -e

远程进入到psql命令行

psql -U pg_user -d pg_db -h pg_host -p 5432

pg数据目录介绍

默认数据目录如下

/usr/local/var/postgres

Linux中可能是:

/var/lib/pgsql/9.5/data 
或
/var/lib/postgres/data 
或
 /home/postgres/data
或其它路径

 数据目录结构大致如下:

PG_VERSION  #pg版本,如10
base/  #每个 database 会在 base 目录下有一个子目录,存储数据库文件
global/   #存放的文件用于存储全局的系统表信息和全局控制信息
pg_commit_ts/  #包含已提交事务的时间
pg_dynshmem/  #包含动态共享内存子系统使用的文件
pg_hba.conf
pg_ident.conf
pg_logical/  #包含逻辑解码的状态数据
pg_multixact/  #包含多事务状态数据(等待锁定的并发事务
pg_notify/   #包含LISTEN/NOTIFY状态数据
pg_replslot/  #包含复制槽数据
pg_serial/   #包含了已经提交的序列化事务的有关信息
pg_snapshots/  #包含导出的快照
pg_stat/  #包含统计子系统的永久文件
pg_stat_tmp/  #包含统计子系统的临时文件
pg_subtrans/  #包含子事务状态数据
pg_tblspc/   #包含表空间的符号链接
pg_twophase/   #包含预备事务的状态文件
pg_wal/  #包含wal日志
pg_xact/
postgresql.auto.conf   #一个用于存储由ALTER SYSTEM 设置的配置参数的文件
postgresql.conf
postmaster.opts   #一个记录服务器最后一次启动时使用的命令行参数的文件
server.log  #pg操作日志,如果有报错也会记录在这里

base目录介绍

base 目录是最重要的一个目录,放的是每一个 database 的数据。base 目录里的每一个数字目录对于一个 database 的 oid, 可以通过 查看 pg_database 这张表查看每一个 数据库的 oid :

$ cd /usr/local/var/postgres/base
total 0
drwx------     192  5 18 15:04 ./
drwx------     832  6  1 22:57 ../
drwx------    9440  5 18 14:49 1/
drwx------    9440  5 18 14:49 12557/
drwx------    9472  6  1 22:31 12558/
drwx------   14336  6  1 22:33 16385/
$

通过数据库查看:

select oid, datname from pg_database ;


oid           datname
---------------------
12558    postgres
16385    my_test_db
1        template1
12557    template0

每一张表的数据(大部分)又是放在 base/(dboid)/(relfilenode) 这个文件里面:

select relname, relowner, relfilenode from pg_class where relowner = 16384;
        relname        | relowner | relfilenode 
-----------------------+----------+-------------
 pg_toast_24589        |    16384 |       24592
 pg_toast_24589_index  |    16384 |       24594
 pg_toast_24595        |    16384 |       24598
 pg_toast_24595_index  |    16384 |       24600
 item_id_seq           |    16384 |       24601
 Feed_pkey             |    16384 |      167963
 feed                  |    16384 |       24589
 item                  |    16384 |       24595
 pg_toast_168003       |    16384 |      168006
 pg_toast_168003_index |    16384 |      168008
 tmp                   |    16384 |      168003
(11 rows)

feed 这张表数据在 base/16384/24589 文件里,item 这张表的数据放在 base/16386/24595 这个文件里。也可以用 pg_relation_filepath 这个函数查询:

select pg_relation_filepath('item');
 pg_relation_filepath 
----------------------
 base/16385/24595
(1 row)

当然实际的存储不会这么简单。每一张表的文件都会有一些附加的存储文件,如文件名后加上 _fsm 的是空闲空间映射表 (Free Space Map)。另外 base/(dboid)/(relfilenode) 这个文件超过 1GB 以后,Postgres 会把这个文件拆分成不超过 1G 的多个文件,文件末尾加上 .1 .2 .3 … 做编号。 如 24589 24589.1 24589.2 。据说这是因为某些文件系统支持的最大文件大小有限制(如 fat32 只支持最大 4G )的文件。

global目录介绍

global下有四种文件:

  1. pg_control
    用于存储全局控制信息
  2. pg_filenode.map
    是pg_class里relfilenode为0的系统表,OID与文件的硬编码映射(每个用户创建的数据库目录下也有同名文件)。
  3. pg_internal.init
    是系统表的cache文件,用于加快读取。默认不存在,查询系统表后自动产生.
  4. 全局系统表文件
    数字命名的文件,用于存储系统表的内容。它们在pg_class里的relfilenode都为0,是靠pg_filenode.map将OID与文件硬编码映射。(注:不是所有的系统表的relfilenode都为0)

其它文件是需要到pg_class里根据OID查到对应的relfilenode来与文件名匹配的。

例如:tab1的relfilenode是16385,那么16385这个文件就是tab1的数据文件

空闲空间映射表
名字以_fsm结尾的文件是数据文件对应的FSM(free space map)文件,用map方式来标识哪些block是空闲的。用一个Byte而不是bit来标识一个block。对于一个有N个字节的block,它在_fsm文件中第blknum个字节中记录的值是(31+N)/32。通过这种方式标识一个block空闲字节数。FSM中不是简单的数组,而是一个三层的树形结构。FSM文件是在需要用到它时才自动产生的。
可见性映射表文件
名字以_vm结尾的文件是数据文件对应的VM(visibility map)。PostgreSQL中在做多版本并发控制时是通过在元组头上标识“已无效”来实现删除或更新的,最后通过VACUUM功能来清理无效数据回收空闲空间。在做VACUUM时就使用VM开快速查找包含无效元组的block。VM仅是个简单的bitmap,一个bit对应一个block
 
 
注:系统表分为全局系统表和库级系统表。
全局系统表位于global下,例如:pg_database,pg_tablespace,pg_auth_members这种存储系统级对象的表。
库级系统表位于数据库目录下,例如:pg_type,pg_proc,pg_attribute这种存储库级对象的表。
值得注意的是pg_class位于库级目录的里,但也包含全局系统表信息,因此研发或运维人员在改动全局系统表信息时需要注意。
data
├── global                # under global, all the filenode is hard-code(select oid,relname,relfilenode from pg_class where relfilenode=0 order by oid;)
│   ├── 1136              # pg_pltemplate
│   ├── 1137              # pg_pltemplate_name_index
│   ├── 1213              # pg_tablespace
│   ├── 1214              # pg_shdepend
│   ├── 1232              # pg_shdepend_depender_index
│   ├── 1233              # pg_shdepend_reference_index
│   ├── 1260              # pg_authid
│   ├── 1261              # pg_auth_members
│   ├── 1262              # pg_database
│   ├── 2396              # pg_shdescription
│   ├── 2397              # pg_shdescription_o_c_index
│   ├── 2671              # pg_database_datname_index
│   ├── 2672              # pg_database_oid_index
│   ├── 2676              # pg_authid_rolname_index
│   ├── 2677              # pg_authid_oid_index
│   ├── 2694              # pg_auth_members_role_member_index
│   ├── 2695              # pg_auth_members_member_role_index
│   ├── 2697              # pg_tablespace_oid_index
│   ├── 2698              # pg_tablespace_spcname_index
│   ├── 2846              # pg_toast_2396
│   ├── 2847              # pg_toast_2396_index
│   ├── 2964              # pg_db_role_setting
│   ├── 2965              # pg_db_role_setting_databaseid_rol_index
│   ├── 2966              # pg_toast_2964
│   ├── 2967              # pg_toast_2964_index
│   ├── 3592              # pg_shseclabel
│   ├── 3593              # pg_shseclabel_object_index
│   ├── 4060              # pg_toast_3592x
│   ├── 4061              # pg_toast_3592_index
│   ├── 6000              # pg_replication_origin
│   ├── 6001              # pg_replication_origin_roiident_index
│   ├── 6002              # pg_replication_origin_roname_index
│   ├── pg_control        # global control file, use pgcheck -pc to see it.
│   ├── pg_filenode.map   # system table (oid -> filenode) mapping file, use pgcheck -pm to see it.
│   └── pg_internal.init  # system table cache file, use pgcheck -pr to see it.
View Code

表空间目录介绍

my_test_db=# select oid,* from pg_tablespace;
  oid  |  spcname   | spcowner | spcacl | spcoptions
-------+------------+----------+--------+------------
  1663 | pg_default |       10 |        |
  1664 | pg_global  |       10 |        |
 49162 | dbspace    |       10 |        |
(3 rows)

每一个Oid都在/pg_tblspc下对应一个名为Oid的软链接文件,指向真正的space目录。

postgresql.conf文件

文件存储路径,连接配置,资源使用,优化配置,日志设置等 
修改需要重启数据库 

主要配置如下:

#------------------------------------------------------------------------------
# FILE LOCATIONS
#------------------------------------------------------------------------------

# The default values of these variables are driven from the -D command-line
# option or PGDATA environment variable, represented here as ConfigDir.

#data_directory = 'ConfigDir'           # use data in another directory
                                        # (change requires restart)
#hba_file = 'ConfigDir/pg_hba.conf'     # host-based authentication file
                                        # (change requires restart)
#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file
                                        # (change requires restart)

# If external_pid_file is not explicitly set, no extra PID file is written.
#external_pid_file = ''                 # write an extra PID file
                                        # (change requires restart)


#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = 'localhost'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)
max_connections = 100                   # (change requires restart)
#superuser_reserved_connections = 3     # (change requires restart)
View Code

pg_hba.conf 文件

服务器主机连接验证配置文件 
修改需要重启数据库 

数据备份和恢复

备份库

pg_dump -h PG_HOST -U PG_USER DATABASE > DATABASE.bak

备份表

pg_dump -h localhost -U postgres(用户名) 数据库名(缺省时同用户名)  -t table(表名) >data.bak

pg_dump命令参数说明:

pg_dump 把一个数据库转储为纯文本文件或者是其它格式.

用法:
  pg_dump [选项]... [数据库名字]

一般选项:
  -f, --file=FILENAME          输出文件或目录名
  -F, --format=c|d|t|p         输出文件格式 (定制, 目录, tar)
                               明文 (默认值))
  -j, --jobs=NUM               执行多个并行任务进行备份转储工作
  -v, --verbose                详细模式
  -V, --version                输出版本信息,然后退出
  -Z, --compress=0-9           被压缩格式的压缩级别
  --lock-wait-timeout=TIMEOUT  在等待表锁超时后操作失败
  -?, --help                   显示此帮助, 然后退出

恢复库/表

psql -h PG_HOST -U PG_USER -d DATABASE < DATABASE.bak
psql -h PG_HOST -U PG_USER -d DATABASE -f DATABASE.bak

注意:

  • 如果直接进入PostgreSQL的安装目录bin下,执行命令,可能会出现 找不到pg_dump,psql的现象,可以用命令的绝对路径,如/usr/local/bin/psql 等
  • 如果是远程备份和恢复,必须保证数据库允许外部访问的权限

数据目录迁移

明天晚上补。

常见数据库操作

基本和mysql类似

# 创建新表 
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);

# 插入数据 
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');

# 选择记录 
SELECT * FROM user_tbl;

# 更新数据 
UPDATE user_tbl set name = '李四' WHERE name = '张三';

# 删除记录 
DELETE FROM user_tbl WHERE name = '李四' ;

# 添加栏位 
ALTER TABLE user_tbl ADD email VARCHAR(40);

# 更新结构 
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;

# 更名栏位 
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;

# 删除栏位 
ALTER TABLE user_tbl DROP COLUMN email;

# 表格更名 
ALTER TABLE user_tbl RENAME TO backup_tbl;

# 删除表格 
DROP TABLE IF EXISTS backup_tbl;

参考:

https://blog.csdn.net/guanguoxiang/article/details/46375653

https://www.jianshu.com/p/cd8c5b988e52

http://www.ruanyifeng.com/blog/2013/12/getting_started_with_postgresql.html 

中文文档

猜你喜欢

转载自www.cnblogs.com/zhoujie/p/pgsql.html