🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
       initdb会创建一个新的PostgreSQL数据库集簇。一个数据库集簇是由一个单一服务器实例管理的数据库的集合。        一个数据库集簇的创建包括创建存放数据库数据的目录、生成共享目录表(属于整个集簇而不是任何特定数据库的表)并且创建`template1`和`postgres`数据库。当你后来创建一个新的数据库时,任何在`template1`数据库中的东西都会被复制(因此,任何已安装在`template1`中的东西都会被自动地复制到后来创建的每一个数据库中)。postgres数据库是便于用户、工具和第三方应用使用的默认数据库。        由于安全原因,由`initdb`创建的新集簇默认将只能由集簇拥有者访问。`--allow-group-access`选项允许与集簇拥有者同组的任何用户读取集簇中的文件。这对非特权用户执行备份很有用。        initdb可以通过`pg_ctl initdb`被调用。 **命令格式:** initdb [option...] [--pgdata \| -D] directory > **option:** > * **-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`行) > * **[-D, --pgdata=]DATADIR**:指定数据库集簇应该存放的目录,可通过设置`PGDATA`环境变量来生效 > * **-E, --encoding=ENCODING** :选择模板数据库的编码。这也将是后来创建的任何数据库的默认编码 > * **-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`从一个文件读取数据库超级用户的口令 > * **-T, --text-search-config=CFG**:设置默认的文本搜索配置 > * **-U, --username=NAME**:选择数据库超级用户的用户名 > * **-W, --pwprompt**:提示输入新超级管理员的密码 > * **-X, --waldir=WALDIR**:这个选项指定预写式日志会被存储在哪个目录中 > * --wal-segsize=SIZE:设置*WAL段尺寸*,以兆字节为单位。这是WAL日志中每个文件的尺寸。默认的尺寸为16兆字节 > > **Less commonly used options:** > * **-d, --debug**:调试输出 > * **-k, --data-checksums**:在数据页面上使用校验码来帮助检测 I/O 系统造成的损坏。启用校验码将会引起显著的性能惩罚。如果设置,则为所有对象计算校验和,在整个数据库中。 所有校验和失败都将报告在`pg_stat_database`视图 > * **-L DIRECTORY**:指定`initdb`应从哪里寻找它的输入文件来初始化数据库集簇 > * **-n, --no-clean**:initdb失败时,不清理之前创建的文件 > * **-N, --no-sync** :默认情况下,`initdb`将等待所有文件被安全地写到磁盘。这个选项会导致`initdb`不等待就返回 > * **-s, --show** :显示内部设置 > * **-S, --sync-only**:安全地把所有数据库文件写入到磁盘并退出 > * **-V, --version**:打印initdb版本并退出。 > * **-?, --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语句,初始化授权相关的表 18.初始化information_schema表、plsql初始化 19.依据template1克隆tempalte0以及最后的创建postgres的数据库 ```