PHP实战中知识总结 / PgSQL - initdb(bin目录文件)

一、initdb

initdb会创建一个新的PostgreSQL数据库集簇。一个数据库集簇是由一个单一服务器实例管理的数据库的集合。

一个数据库集簇的创建包括创建存放数据库数据的目录、生成共享目录表(属于整个集簇而不是任何特定数据库的表)并且创建template1和postgres数据库。当你后来创建一个新的数据库时,任何在template1数据库中的东西都会被复制(因此,任何已安装在template1中的东西都会被自动地复制到后来创建的每一个数据库中)。postgres数据库是便于用户、工具和第三方应用使用的默认数据库。

由于安全原因,由initdb创建的新集簇默认将只能由集簇拥有者访问。--allow-group-access选项允许与集簇拥有者同组的任何用户读取集簇中的文件。这对非特权用户执行备份很有用。

二、调用方法

initdb可以通过pg_ctl initdb被调用。

命令格式:

initdb [option...] [--pgdata | -D] directory

option:

(1)-A , --auth=METHOD:这个选项为本地用户指定在pg_hba.conf中使用的默认认证方法(host和local行)。initdb将使用指定的认证方法为非复制连接以及复制连接填充pg_hba.conf项

--auth-host=METHOD:这个选项为通过 TCP/IP 连接的本地用户指定在pg_hba.conf中使用的认证方法(host行)

--auth-local=METHOD:这个选项为通过 Unix 域套接字连接的本地用户指定在pg_hba.conf中使用的认证方法(local行)

(2)[-D, --pgdata=]DATADIR:指定数据库集簇应该存放的目录,可通过设置PGDATA环境变量来生效

(3)-E, --encoding=ENCODING :选择模板数据库的编码。这也将是后来创建的任何数据库的默认编码

(4)-g, --allow-group-access: 允许与集簇拥有者同组的用户读取initdb创建的所有集簇文件

--locale=LOCALE:为数据库集簇设置默认区域

--lc-collate=, --lc-ctype=, --lc-messages=LOCALE

--lc-monetary=, --lc-numeric=, --lc-time=LOCALE

--no-locale:等效于--locale=C

--pwfile=FILE:让initdb从一个文件读取数据库超级用户的口令

(5)-T, --text-search-config=CFG:设置默认的文本搜索配置

(6)-U, --username=NAME:选择数据库超级用户的用户名

(7)-W, --pwprompt:提示输入新超级管理员的密码

(8)-X, --waldir=WALDIR:这个选项指定预写式日志会被存储在哪个目录中

--wal-segsize=SIZE:设置WAL段尺寸,以兆字节为单位。这是WAL日志中每个文件的尺寸。默认的尺寸为16兆字节

Less commonly used options:

(1)-d, --debug:调试输出

(2)-k, --data-checksums:在数据页面上使用校验码来帮助检测 I/O 系统造成的损坏。启用校验码将会引起显著的性能惩罚。如果设置,则为所有对象计算校验和,在整个数据库中。 所有校验和失败都将报告在pg_stat_database视图

(3)-L DIRECTORY:指定initdb应从哪里寻找它的输入文件来初始化数据库集簇

(4)-n, --no-clean:initdb失败时,不清理之前创建的文件

(5)-N, --no-sync :默认情况下,initdb将等待所有文件被安全地写到磁盘。这个选项会导致initdb不等待就返回

(6)-s, --show :显示内部设置

(7)-S, --sync-only:安全地把所有数据库文件写入到磁盘并退出

(8)-V, --version:打印initdb版本并退出。

(9)-?, --help :显示有关initdb命令行参数的帮助并退出。

三、initdb -D $PG_DATA 初始化过程

(1)从参数中获取到PGDATA的路径(也可以从环境变量中获取PG_DATA的环境变量获取)

(2)初始化如果str_wal_segment_size_mb未设置,则设置为16mb,如果设置了必须是是2的整数倍,并且检验wal segment的大小最大是1G,最小是1Mb

(3)通过initdb 程序查找 postgres的主程序,并且校验它的正确性

(4)如果没有指定用户,则获取当前执行命令的用户,作为create cluster的主用户(pg中用户不能以pg_开头,否则会初始化失败)。

(5)设置pg版本号以及设置初始化需要的资源 ($pg_installtion/share/postgres.bki,postgresql.conf.sample)

(6)设置postgresql编码,并且依据pg_enc校验编码是否正确

(7)创建pg_data和pg_data/pg_wal目录

(8)遍历获取sundirs下所有的目录,并且父目录都是pg_data开始创建目录,并且检查目录的有限性

(9)把postgresql版本写入pg_data/PG_VERSION文件并且创建postgresql.conf文件,并写入默认配置模板

(10)读取postgres.bki 文件,替换PostgreSQL/NAMEDATALEN/SIZEOF_POINTER/ALIGNOF_POINTER/POSTGRES/ENCODING 等等,其中 NAMEDATALEN 设置了表名/列名/函数名的长度硬编码为64个字符。并创建系统template1数据库,并在pg_data/base/1中写入postgresql的主版本

(11)打开 /home/perrynzhou/Database/pgsql/bin/postgres\ --single -F -O -j -c search_path=pg_catalog -c exit_on_error=true template1 >/dev/null 命令,等待执行命令

(12)通过postgres主程序执行 REVOKE ALL on pg_authid FROM public 给 template1授权

(13)往系统表pg_xxx插入默认的数据

(14)在template1中执行system_views.sql 语句

(15)初始化系统表xxx_description和pg_collation

(16)执行snowball_create.sql语句,初始化授权相关的表

(17)初始化information_schema表、plsql初始化

(18)依据template1克隆tempalte0以及最后的创建postgres的数据库

PHP实战中知识总结