postgresql中initdb初始化过程

2018-11-24  本文已影响126人  perryn
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"
};


上一篇下一篇

猜你喜欢

热点阅读