main() {
setup_pgdata();
setup_bin_paths(argv[0]);
initialize_data_directory()
{
PG_CMD_OPEN;
//创建pg_data目录
create_data_directory();
//创建pg_data/pg_wal目录
create_xlog_or_symlink();
//遍历获取sundirs下所有的目录,并且父目录都是pg_data开始创建目录,并且检查目录的有限性
//把postgresql笨笨写入到pg_data/PG_VERSION文件中
write_version_file(NULL);
//在pg_data下创建postgresql.conf文件
set_null_conf();
//设置默认配置模板写入到postgresql.conf中
setup_config();
//读取postgres.bki 文件,替换PostgreSQL/NAMEDATALEN/SIZEOF_POINTER/ALIGNOF_POINTER/POSTGRES/ENCODING 等等,并创建系统template1数据库,其中 NAMEDATALEN 设置了表名/列名/函数名的长度硬编码为64个字符
bootstrap_template1();
//在pg_data/base/1/PG_VERSION中写入postgresql的主版本
write_version_file("base/1");
//打开 "/home/perrynzhou/Database/pgsql/bin/postgres\" --single -F -O -j -c search_path=pg_catalog -c exit_on_error=true template1 >/dev/null 命令,等待执行命令
PG_CMD_OPEN;
//通过执行" REVOKE ALL on pg_authid FROM public"授权
setup_auth(cmdfd);
// 往系统表pg_xxx插入默认的数据
setup_depend(cmdfd);
//在template1中执行system_views.sql 语句
setup_sysviews(cmdfd);
// 初始化系统表xxx_description
setup_description(cmdfd);
//初始化系统表pg_collation
setup_collation(cmdfd);
setup_conversion(cmdfd);
//执行snowball_create.sql语句
setup_dictionary(cmdfd);
//初始化授权相关的表
setup_privileges(cmdfd);
//通过执行information_schema.sql初始化information_schema表,
setup_schema(cmdfd);
//执行 CREATE EXTENSION plpgsql语句
load_plpgsql(cmdfd);
//执行ANALYZE和VACUUM FREEZE
vacuum_db(cmdfd);
//通过template1初始化template0
make_template0(cmdfd);
//创建postgres数据库
make_postgres(cmdfd);
}
}
image.png
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的数据库
static const char *const subdirs[] = {
"global",
"pg_wal/archive_status",
"pg_commit_ts",
"pg_dynshmem",
"pg_notify",
"pg_serial",
"pg_snapshots",
"pg_subtrans",
"pg_twophase",
"pg_multixact",
"pg_multixact/members",
"pg_multixact/offsets",
"base",
"base/1",
"pg_replslot",
"pg_tblspc",
"pg_stat",
"pg_stat_tmp",
"pg_xact",
"pg_logical",
"pg_logical/snapshots",
"pg_logical/mappings"
};
网友评论