我是靠谱客的博主 认真河马,最近开发中收集的这篇文章主要介绍mysql 演示吧_postgresql常见命令及操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

pgsql已经更新到beta11了,不同版本的服务器启动或相关命令、配置可能会有不同,所以得根据pg版本进行操作。下面记录一些工作中常用到的一些操作,主要包括服务启动、备份/恢复数据、数据目录迁移、常见操作命令

本文环境:

postgres : v10.3

os: MAC

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

服务启动

安装

brew installpostgresqlwhichpsql~$ /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.

设置开机自动启动

ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

常用命令

查看版本

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

命令总结

1.用户实用程序:

createdb 创建一个新的PostgreSQL的数据库(和SQL语句:CREATE DATABASE 相同)

createuser 创建一个新的PostgreSQL的用户(和SQL语句:CREATE USER 相同)

dropdb 删除数据库

dropuser 删除用户

pg_dump 将PostgreSQL数据库导出到一个脚本文件

pg_dumpall 将所有的PostgreSQL数据库导出到一个脚本文件

pg_restore 从一个由pg_dump或pg_dumpall程序导出的脚本文件中恢复PostgreSQL数据库

psql 一个基于命令行的PostgreSQL交互式客户端程序

vacuumdb 清理和分析一个PostgreSQL数据库,它是客户端程序psql环境下SQL语句VACUUM的shell脚本封装,二者功能完全相同

2. 系统实用程序

1). pg_ctl 启动、停止、重启PostgreSQL服务(比如:pg_ctl start 启动PostgreSQL服务,它和service postgresql start相同)

2). pg_controldata 显示PostgreSQL服务的内部控制信息

3). psql 切换到PostgreSQL预定义的数据库超级用户postgres,启用客户端程序psql,并连接到自己想要的数据库,比如说:

psql template1

出现以下界面,说明已经进入到想要的数据库,可以进行想要的操作了。

template1=#

3. 在数据库中的一些命令:

template1=# l 查看系统中现存的数据库

template1=# q 退出客户端程序psql

template1=# c 从一个数据库中转到另一个数据库中,如template1=# c sales 从template1转到sales

template1=# dt 查看表

template1=# d 查看表结构

template1=# di 查看索引

[基本数据库操作]==============

1). *创建数据库: create database [数据库名];

2). *查看数据库列表: d

3). *删除数据库: . drop database [数据库名];

创建表: create table ([字段名1] [类型1] ;,[字段名2] [类型2],......;);

*查看表名列表: d

*查看某个表的状况: d [表名]

*重命名一个表: alter table [表名A] rename to [表名B];

*删除一个表: drop table [表名];

[表内基本操作]===============

*在已有的表里添加字段: alter table [表名] add column [字段名] [类型];

*删除表中的字段: alter table [表名] drop column [字段名];

*重命名一个字段: alter table [表名] rename column [字段名A] to [字段名B];

*给一个字段设置缺省值: alter table [表名] alter column [字段名] set default [新的默认值];

*去除缺省值: alter table [表名] alter column [字段名] drop default;

在表中插入数据: insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......);

修改表中的某行某列的数据: update [表名] set [目标字段名]=[目标值] where [该行特征];

删除表中某行数据: delete from [表名] where [该行特征];

delete from [表名];--删空整个表

4. PostgreSQL用户认证

PostgreSQL数据目录中的pg_hba.conf的作用就是用户认证,可以在/usr/local/pgsql/data中找到。

有以下几个例子可以看看:

(1)允许在本机上的任何身份连接任何数据库

TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD

local all all trust(无条件进行连接)

(2)允许IP地址为192.168.1.x的任何主机与数据库sales连接

TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD

host sales all 192.168.1.0 255.255.255.0 ident sameuser(表明任何操作系统用户都能够以同名数据库用户进行连接)

5. 来一个完整的创建PostgreSQL数据库用户的示例吧

(1)进入PostgreSQL高级用户

(2)启用客户端程序,并进入template1数据库

psql template1

(3)创建用户

template1=# CREATE USER hellen WITH ENCRYPED PASSWORD'zhenzhen'

(4)因为设置了密码,所以要编辑pg_hba.conf,使用户和配置文件同步。

在原有记录上面添加md5

local all hellen md5

(5)使用新用户登录数据库

template1=# q

psql -U hellen -d template1

PS:在一个数据库中如果要切换用户,要使用如下命令:

template1=# !psql -U tk -d template1

6. 设定用户特定的权限

还是要用例子来说明:

创建一个用户组:

sales=# CREATE GROUP sale;

添加几个用户进入该组

sales=# ALTER GROUP sale ADD USER sale1,sale2,sale3;

授予用户级sale针对表employee和products的SELECT权限

sales=# GRANT SELECT ON employee,products TO GROUP sale;

在sale中将用户user2删除

sales=# ALTER GROUP sale DROP USER sale2;

7. 备份数据库

可以使用pg_dump和pg_dumpall来完成。比如备份sales数据库:

pg_dump sales>/home/tk/pgsql/backup/1.bak

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

total0drwx------ 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/$

通过数据库查看:

selectoid, datname from pg_database ;

oid datname---------------------

12558postgres16385my_test_db1template112557 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下有四种文件:

pg_control

用于存储全局控制信息

pg_filenode.map

是pg_class里relfilenode为0的系统表,OID与文件的硬编码映射(每个用户创建的数据库目录下也有同名文件)。

pg_internal.init

是系统表的cache文件,用于加快读取。默认不存在,查询系统表后自动产生.

全局系统表文件

数字命名的文件,用于存储系统表的内容。它们在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位于库级目录的里,但也包含全局系统表信息,因此研发或运维人员在改动全局系统表信息时需要注意。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

data

├── global # under global, all the filenode is hard-code(select oid,relname,relfilenode from pg_class where relfilenode=0order 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 controlfile, 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 cachefile, use pgcheck -pr to see it.

View Code

表空间目录介绍

my_test_db=# select oid,* frompg_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文件

文件存储路径,连接配置,资源使用,优化配置,日志设置等

修改需要重启数据库

主要配置如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

#------------------------------------------------------------------------------# 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 inanother 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 PIDfileis 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 '*' forall

# (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 * FROMuser_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 TOsignup;

# 删除栏位ALTER TABLE user_tbl DROP COLUMNemail;

# 表格更名ALTER TABLE user_tbl RENAME TObackup_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的文件内容如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

# 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 afile "/etc/systemd/system/postgresql-10.service",

# containing

# .include/lib/systemd/system/postgresql-10.service

# ...makeyour changes here...

# Formore infoabout 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:donot use a PGDATA pathname containing spaces, or you will

# break postgresql-setup.

[Unit]

Description=PostgreSQL 10database 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 whitespacein 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 OOMkillon the postmaster

OOMScoreAdjust=-1000Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj

Environment=PG_OOM_ADJUST_VALUE=0ExecStartPre=/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 notkillpostmaster

# during crash recovery.

TimeoutSec=0[Install]

WantedBy=multi-user.target

View Code

如果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目录

cd /usr/lib/systemd/system/

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. 验证

show data_directory;

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 "UserID"

,CASE

WHENu.usesuperAND 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"FROMpg_catalog.pg_user uORDER BY 1;--或者直接这么查

select * from pg_catalog.pg_user

3)注意:postgresql已经作为服务添加到了systemctl

MAC 系统数据目录迁移思路同上。

参考:

最后

以上就是认真河马为你收集整理的mysql 演示吧_postgresql常见命令及操作的全部内容,希望文章能够帮你解决mysql 演示吧_postgresql常见命令及操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部