标签:xpl kill roi pid reserve htm 打印 setting 主机
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_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
默认数据目录如下
/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 目录是最重要的一个目录,放的是每一个 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下有四种文件:
其它文件是需要到pg_class里根据OID查到对应的relfilenode来与文件名匹配的。
例如:tab1的relfilenode是16385,那么16385这个文件就是tab1的数据文件
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.
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目录。
文件存储路径,连接配置,资源使用,优化配置,日志设置等
修改需要重启数据库
主要配置如下:
#------------------------------------------------------------------------------ # 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)
服务器主机连接验证配置文件
修改需要重启数据库
备份库
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
注意:
基本和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;
通常数据目录会安装在系统盘,而系统盘的空间有限,当数据库量大或日志多时,会撑爆硬盘造成服务停掉,因此通常将数据迁移到数据盘
在CentOS 系统中,pg的默认数据安装目录是
/var/lib/pgsql/{version}/data
数据库服务一般开机自动启动,那么就可以顺藤摸瓜找到相关的service。
对于postgresql10,它的服务名为postgresql-10.service,该文件的路径为:
/usr/lib/systemd/system/postgresql-10.service
postgresql-10.service的文件内容如下:
# It‘s not recommended to modify this file in-place, because it will be # overwritten during package upgrades. If you want to customize, the # best way is to create a file "/etc/systemd/system/postgresql-10.service", # containing # .include /lib/systemd/system/postgresql-10.service # ...make your changes here... # For more info about custom unit files, see # http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F # Note: changing PGDATA will typically require adjusting SELinux # configuration as well. # Note: do not use a PGDATA pathname containing spaces, or you will # break postgresql-setup. [Unit] Description=PostgreSQL 10 database server Documentation=https://www.postgresql.org/docs/10/static/ After=syslog.target After=network.target [Service] Type=notify User=postgres Group=postgres # Note: avoid inserting whitespace in these Environment= lines, or you may # break postgresql-setup. # Location of database directory Environment=PGDATA=/home/pgsql/data/ # Where to send early-startup messages from the server (before the logging # options of postgresql.conf take effect) # This is normally controlled by the global default set by systemd # StandardOutput=syslog # Disable OOM kill on the postmaster OOMScoreAdjust=-1000 Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj Environment=PG_OOM_ADJUST_VALUE=0 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} ExecStart=/usr/pgsql-10/bin/postmaster -D ${PGDATA} ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT # Do not set any timeout value, so that systemd will not kill postmaster # during crash recovery. TimeoutSec=0 [Install] WantedBy=multi-user.target
如果postgresql没有作为服务加到systemctl, 则修改对应的配置文件postgresql.conf中的data_directory的值,通过pg_ctl启动,和下面操作一样
从上面来看里面用到了PGDATA Environment,后面需要修改该变量,但是得先执行下列步骤:
1. 关闭数据库服务
service postgresql-10 stop
2. 拷贝原先的data目录到新的data目录
sudo cp -rf /var/lib/pgsql/10/data /home/pgsql/data
3. 设置用户和权限
# 修改data_directory的所有者 sudo chown -R postgres:postgres /home/pgsql/data
# 设置数据目录权限 sudo chmod 700 /home/pgsql/data
4. 上述2、3完成后,可以修改service文件里面的enviroment变量,可以将这个变量修改为自己的data目录
sudo vi postgresql-10.service ~ 修改这个文件中的
Environment=PGDATA=/var/lib/pgsql/10/data/
将其修改为自己的新的数据路径:
Environment=PGDATA=/home/psql/data/
修改PGDATA路径之后,就可以执行下面的命令让其立即生效
sudo systemctl daemon-reload
5. 重启数据库
service postgresql-10 start
6. 验证
1)如果还没有改正过来,可以看下PGDATA这个变量的位置,
这个变量的位置在哪呢?这里因为postgresql安装后会自动生成一个postgres用户,因此猜测这个用户下存在PGDATA环境变量
su - postgres ,进入postgres用户下,查看当前用户的环境变量
echo $PGDATA,打印出PGDATA变量值,可以看到这个变量值还是之前那个值。因此我们可以知道了,是这个地方有问题。
于是,修改这个用户的环境变量设置文件
vi ~/.bash_profile,修改里面的PGDATA路径
source ~/.bash_profile使文件生效
再重启数据库服务
2)可能需要postgres用户的宿主目录
cat /etc/passwd
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
sudo usermod -d /home/data/pgsql -u 26 postgres
查看数据库用户
SELECT u.usename AS "User name", u.usesysid AS "User ID" , CASE WHEN u.usesuper AND u.usecreatedb THEN CAST(‘superuser, createdatabase‘ AS pg_catalog.text) WHEN u.usesuper THEN CAST(‘superuser‘ AS pg_catalog.text) WHEN u.usecreatedb THEN CAST(‘create database‘ AS pg_catalog.text) ELSE CAST(‘‘ AS pg_catalog.text) END AS "Attributes" FROM pg_catalog.pg_user u ORDER BY 1; -- 或者直接这么查 select * from pg_catalog.pg_user
3)注意:postgresql已经作为服务添加到了systemctl
参考:
https://blog.csdn.net/guanguoxiang/article/details/46375653
标签:xpl kill roi pid reserve htm 打印 setting 主机
原文地址:https://www.cnblogs.com/zhoujie/p/pgsql.html