美文网首页
postgresql中initdb初始化过程

postgresql中initdb初始化过程

作者: perryn | 来源:发表于2018-11-24 19:46 被阅读126次
    • 核心代码概览
    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"
    };
    
    
    

    相关文章

      网友评论

          本文标题:postgresql中initdb初始化过程

          本文链接:https://www.haomeiwen.com/subject/apiyqqtx.html