加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgresql第二讲:创建和访问数据库过程详解

发布时间:2020-12-13 17:17:38 所属栏目:百科 来源:网络整理
导读:一、访问数据库 1 、访问本地postgres数据库: # su – postgres # 切换至postgres用户 # psql # 直接访问,默认进入本地postgres数据库 2 、访问指定的数据库: # su – postgres # 切换至postgres用户 # psql huangxifeng # 直接访问本地huangxifeng数据库

一、访问数据库

1、访问本地postgres数据库:

# su – postgres #切换至postgres用户

# psql #直接访问,默认进入本地postgres数据库

2、访问指定的数据库:

# su – postgres #切换至postgres用户

# psql huangxifeng #直接访问本地huangxifeng数据库

3、访问远程数据库

# psql -h 172.16.254.21 -p 5432 -U postgres –d huangxifeng

4、访问数据库过程详解:

以第一种方式为例,当以postgres用户访问数据库时,postgresql产生一个服务进程来接受客户端传过来的请求,并代理客户端执行数据库的各种操作。

# psql #直接访问,默认进入本地postgres数据库

查看数据库字典表pg_stat_activity可以知道有什么用户在访问,访 问什么库以及访问的进程

postgres=# select datid,datname,procpid,usename,xact_start from pg_stat_activity;

datid | datname | procpid | usename | xact_start

-------+------------------+---------+----------+-------------------------------

11511 | postgres | 14190 | postgres | 2010-11-22 17:26:20.022066-05

11511 | postgres | 14145 | postgres |

从查询结果可以看到,数据库名为postgres,有一个进程ID为14190的在访问,开始活动的时间为2010-11-22 17:26:20.022066-05。

进程ID为14190正是服务器产生的进程,代理客户端来执行数据库的各种操作。在linux中通过ps可以看到此进程。

# ps aux|grep postgres|grep 14190

postgres 14190 0.0 1.1 102232 4348 ? Ss 17:21 0:00 postgres: postgres postgres [local] idle

因此,当某一数据库进程异常操作数据库时,要进行中断该进程可通过服务器进程进行

#kill -9 14190;

执行该操作时要谨慎小心,一旦杀掉进程,该客户端已经发送但未执行的SQL和正在执行的SQL都将会失败而丢失。

安全的操作可以通过pg_cancel_backend取消一个后端的当前查询:

postgres=# select pg_cancel_backend(14190);

pg_cancel_backend

-------------------

t

(1 row)

二、创建数据库

Psql创建一个数据库的方式主要是两 种:

1 linux命令行创建:

$ createdb huangxifeng #创建一个数据库名为:huangxifeng的数据库

创建完成,可以查看创建是否成 功的数据库

$psql

postgres=# l #查看所有数据库

List of databases

Name | Owner | Encoding

------------------+----------+----------

huangxifeng | postgres | UTF8

postgres | postgres | UTF8

template0 | postgres | UTF8

template1 | postgres | UTF8

(4 rows)

可以看到name为huangxifeng的数据库已经创建成功,owner为postgres,编码为utf8.

实际中为了控制权限,可以新建 一个用户为huangxifeng,并把数据库的owner权限赋予该用户,然后再创建数据库。

postgres=# create role huangxifeng password 'hxf' login;

CREATE ROLE

$createdb -O huangxifeng huangxifeng #-O指定用户名为huangxifeng

$psql

postgres=# l #查看所有数据库

List of databases

Name | Owner | Encoding

------------------+----------+----------

huangxifeng | huangxifeng | UTF8

postgres | postgres | UTF8

template0 | postgres | UTF8

template1 | postgres | UTF8

(4 rows)

数据库名为huangxifeng,数据库的所有者是huangxifeng.

2 postgresql中创建数据库

postgres=# create database hxf owner huangxifeng;

CREATE DATABASE

postgres=# l

List of databases

Name | Owner | Encoding

------------------+-------------+----------

huangxifeng | huangxifeng | UTF8

hxf | huangxifeng | UTF8

postgres | postgres | UTF8

template0 | postgres | UTF8

template1 | postgres | UTF8

(5 rows)

三、创建数据库过程详解

(1) 创建一个数据库时,在公共的global存储目录下写入新库的公共信息,如数据名和数据库所在的目录等

(2) 以创建名为huangxifeng的数据库为例

postgres@test21:~$ pg_lsclusters

Version Cluster Port Status Owner Data directory Log file

8.3 5shen_db 5432 online postgres /var/lib/postgresql/8.3/5shen_db custom

实例的目录在/var/lib/postgresql/8.3/5shen_db下,cd到该目录下

$cd /var/lib/postgresql/8.3/5shen_db

$ ls

base pg_clog pg_multixact pg_tblspc PG_VERSION postmaster.opts root.crt server.key

global pg_log pg_subtrans pg_twophase pg_xlog postmaster.pid server.crt

以上显示的所有文件中,目录global包含实例(集群)范围的表的子目录,主要是公共的信息。

$cd global

$ ls

1136 1213 1232 1260 1262 2397 2672 2677 2695 2698 2843 2845 2847 pg_control pgstat.stat

1137 1214 1233 1261 2396 2671 2676 2694 2697 2842 2844 2846 pg_auth pg_database

那么该目录下这些文件是什么涵义 呢?

$ file pg_control

pg_control: data

$ strings pg_control

en_US.UTF-8

en_US.UTF-8

所 以,pg_control为公共访问环境信息,包括编码信息,

$ strings pgstat.stat #数据库统计信息(空)

以上这两个文件均为二进制文件。

即创建新数据库的过程不会向这两 个文件中写入信息,是系统公共的信息。但会向文件pg_auth认证(新建用户),pg_database数据库信息写入信息,这两个文件为文本文件,我们可以直接查看其中的内容。

$ cat pg_auth

"huangxifeng" "md57190d79abe15401d107f59f5e7150cc2" ""

"menu" "md5759bfe7475b04240e12607ef3baba822" ""

"postgres" "md5fbf3e4ff242ffe9dc60e3c9dc4d3c831" ""

由以上内容可见,创建一个用户名 为:huangxifeng,向pg_auth文件插入一条记录,说明认证是通过md5加密来访问的,md5后面是密码的加密串。

那么 pg_database保存什么内容呢?

$ cat pg_database

"template1" 1 1663 378

"template0" 11510 1663 378

"postgres" 11511 1663 378

"menu" 32437 1663 378

"huangxifeng" 52205 1663 378

"hxf" 52206 1663 378

由以上内容可见,创建一个新的数 据库huangxifeng,向pg_database文件中插入一条记录,第一列为数据库名,数据库名后面有三个数字,这三个数字各代表什么意思呢?

现在我们来看数据库字典中是如何 记录数据库信息的,它与pg_database文件,与base目录又有什么样的关联?

huangxifeng=# select a.datid,a.datname,b.datfrozenxid,b.dattablespace from pg_stat_database a inner join pg_database b on a.datname=b.datname;

datid | datname | datfrozenxid | dattablespace

-------+-------------+--------------+---------------

1 | template1 | 378 | 1663

11510 | template0 | 378 | 1663

11511 | postgres | 378 | 1663

32437 | menu | 378 | 1663

52205 | huangxifeng | 378 | 1663

52206 | hxf | 378 | 1663

(6 rows)

从以上查询可以知道,pg_database文件中数据库名后面的三个数字代表的涵义,如

"huangxifeng" 52205 1663 378

52205是数据库的ID,1663是数据库使用的表空间(默认系 统表空间),378是数据库初始化后冻结的事务ID。

数据库字典表Pg_stat_database记录了实例中所有数据库名和数据 库的ID及其它相关信息:

postgres=# select datid,datname from pg_stat_database ;

datid | datname

-------+-------------

1 | template1

11510 | template0

11511 | postgres

32437 | menu

52205 | huangxifeng

52206 | hxf

(6 rows)

再来看系统base目录下的子目录

$ ls /var/lib/postgresql/8.3/5shen_db/base/

1 11510 11511 32437 52205 52206 pgsql_tmp

我们发现用数据库的ID为名称在base目录下创建相应的目录,每一个目录对应一个数据库。

现在我们进入数据库huangxifeng的目录52205,发现在一共有129个由数字命名的文件,

查看其中一个文件的类型

$ file 11429

11429: data

这个文件是数据库文件,由postgresql读取的,它实际上是huangxifeng数据库的一个对象,这些对象可以是表,索引及系统的其它对象。在数据库字典中,从下面查询可以看到11429这个对象是一个表:

huangxifeng=# select relid,schemaname,relname from pg_stat_all_tables where relid=11429;

relid | schemaname | relname

-------+--------------------+--------------

11429 | information_schema | sql_features

(1 row)

现在huangxifeng库是空的数据库,也就是没有任何一个用户自己建的数据表,那么现在新建一个表,base目录有什么变化?

huangxifeng=# create table hxf_member(uid int,uname varchar(50));

CREATE TABLE

huangxifeng=# select relid from pg_stat_all_tables where relname='hxf_member';

relid

-------

52207

(1 row)

postgres@test21:~/8.3/5shen_db/base/52205$ ls -lh 52207

-rw------- 1 postgres postgres 0 2010-11-23 10:26 52207

由上面可以看到在数据库huangxifeng的目录52205的目录下新建了一个以表id 52207命名的文件。注意到新建数据库huangxifeng的数据库id为52205,接着新建数据库hxf的数据库id为52206,现在新建一个表的对象id为52207,证明数据库对象的id统一使用系统的序列。

相关的系统字典表如下:

pg_stat_activity 数据库活动进程视图

Pg_database 系统数据库字典

Pg_stat_database系统统计数据库字典视图

Pg_stat_sys_tables 系统字典表

Pg_stat_sys_indexes系统字典表索引

Pg_stat_user_tables用户表

Pg_stat_user_indexes 用户表索引

pg_stat_all_tables 数据库所有的表(包括系统表和用户表)

pg_stat_all_indexs数据库所有的表的索引(包括系 统表和用户表的索引)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读