Jadual Kandungan
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
Rumah pangkalan data tutorial mysql PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:

PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:

Jun 07, 2016 pm 03:38 PM
post postgresql mulakan Hidangkan proses

话说调用 InitPostgres 方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,上一节讨论了portal管理环境的初始化,这一节继续讨论剩余的相关初始化。

         话说调用InitPostgres方法给portgres服务进程做相关初始化,这个方法里初始化了relcache和catcache,初始化了执行查询计划的portal的管理器,填充本进程PGPROC结构相关部分成员等,上一节讨论了portal管理环境的初始化,这一节继续讨论剩余的相关初始化。

1

先看InitPostgres方法的调用序列梗概图


PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:
InitPostgres方法的调用序列梗概图

         InitPostgres方法为初始化这个postgres服务进程做了一系列的工作,具体如下:

(1)调用InitProcessPhase2方法,把本进程的PGPROC结构注册到PGPROC数组,就是让共享内存里的PGPROC数组(初始化PGPROC数组的文章见《PostgreSQL启动过程中的那些事七:初始化共享内存和信号十一:shmem中初始化SharedProcArray》)的第一个空元素指向这个PGPROC结构,并注册退出时做内存清理的函数。

(2)调用SharedInvalBackendInit方法,在该后台进程数据的共享失效管理器数组获取一个ProcState结构(相关数据结果见《PostgreSQL启动过程中的那些事七:初始化共享内存和信号十三:shmem中初始化SharedInvalidationState》)给该进程并初始化相关项,并注册退出方法以在退出时标记本进程的项非活跃。

(3)调用ProcSignalInit方法,ProcSignalSlot结构数组(关于ProcSignalSlot结构数组参见《PostgreSQL启动过程中的那些事七:初始化共享内存和信号十四:shmem中初始化PMSignal》)ProcSignalSlots里给当前进程获取一个元素,元素下标是MyBackendId-1,并注册以在进程退出时释放这个槽。

(4)为访问XLOG,调用RecoveryInProgress方法做共享内存相关初始化。

(5)调用RelationCacheInitlisze方法做管理relcache的环境的初始化。

(6)调用InitCatalogCache方法做管理catcache的环境的初始化。

(7)调用EnablePortalManager方法初始化portal管理器。

(8)调用RelationCacheInitializePhase2方法初始化共享系统表。

(9)调用GetTransactionSnapshot方法获取一个事务快照。这个方法在后面讨论简单查询时再讨论。

10)调用PerformAuthentication方法根据hba文件设置进行客户端认证。

11)调用GetDatabaseTuple方法根据数据库名字从pg_database系统表获取要访问的数据库对应的元组。

12)调用RelationCacheInitializePhase3方法完成relcache初始化。

13)调用CheckMyDatabase方法检查当前用户的数据库访问权限,从cache里的pg_database取当前数据库的相关属性字段。

14)调用InitializeClientEncoding方法初始化客户端字符编码。

15)调用pgstat_bestart方法在PgBackendStatus设置本进程状态。

 

2

这一节概论第8步到第15步。先看一下后续方法的调用序列图,为了图能大一点,PostgresMain以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“InitPostgres方法的调用序列梗概图”。

 


PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:

相关方法调用序列图

 

下面讨论第(8)步,RelationCacheInitializePhase2方法初始化共享catalog。先看一下为什么要有第(5)、(8)、(12)步三步来初始化relcache。当前还处在数据库服务器和客户端建立连接的过程中,数据库服务器的服务进程要根据连接串中指定数据库加载其相关对象,但此时服务器端还没有加载访问数据库的基础设施,比如系统表"pg_database""pg_authid""pg_auth_members"等的描述符及其相关索引信息,因此无法通过系统表访问数据库的相关信息。第(5)步初始化relcache的管理环境,参见《

PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境

》。第(8)步通过"global/pg_filenode.map""global/pg_internal.init"文件初始化共享catalog"pg_catalog",将系统表"pg_database""pg_authid""pg_auth_members"等的描述符信息加载到relcache里。"global/pg_filenode.map"文件里存放的是数据库中关系和文件节点的映射信息,"global/pg_internal.init"文件里存放的是"pg_class""pg_attribute""pg_proc""pg_type"等系统关系信息。然后完成设置数据库快照(第9步)、根据hba文件完成客户端认证(第10步)、pg_database获取客户端要访问的数据库的对应元组(第11步),第12)步根据要访问的数据库ID,加载该数据库本地的"pg_filenode.map""pg_internal.init"文件完成初始化。加载"pg_class""pg_attribute""pg_proc""pg_type"等及其索引信息。如果从相关"pg_filenode.map""pg_internal.init"文件初始化失败,系统会从硬编码的代码中初始化基础设施相关关系信息,下面摘录了"pg_database""pg_authid""pg_auth_members"的硬编码信息。不管加载那个文件,完成相关信息初始化后如有必要将重新该文件。重写时先写临时文件,写完后改文件名为正式文件。这样做是为了避免并发的后台进程读相关文件时崩溃。关于文件名举个例子,例如文件"data/global/pg_internal.init",对应的临时文件名是"data/global/pg_internal.init.pid",最后的"pid"是当前进程ID

第(13)步调用CheckMyDatabase方法检查当前用户的数据库访问权限,从cache里的pg_database取当前数据库的相关属性字段。第(14)调用InitializeClientEncoding方法初始化客户端字符编码。第(15)调用pgstat_bestart方法在PgBackendStatus设置本进程状态。至此pg服务进程的初始化工作告一段落。

下面是部分系统关系硬编码信息:

DATA(insert OID = 11 ( "pg_catalog" PGUID _null_ ));

DESCR("system catalog schema");

#define PG_CATALOG_NAMESPACE11

 

 

 

#define DatabaseRelationId  1262

#define DatabaseRelation_Rowtype_Id  1248

 

CATALOG(pg_database,1262)BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO

{

    NameData   datname;      /* database name */

    Oid        datdba;           /* owner of database */

    int4       encoding;     /* character encoding */

    NameData   datcollate;       /* LC_COLLATE setting */

    NameData   datctype;     /* LC_CTYPE setting */

    bool       datistemplate;    /* allowed as CREATE DATABASE template? */

    bool       datallowconn; /* new connections allowed? */

    int4       datconnlimit; /* max connections allowed (-1=no limit) */

    Oid        datlastsysoid;    /* highest OID to consider a system OID */

    TransactionId datfrozenxid; /* all Xids

    Oid        dattablespace;    /* default table space for this DB */

    aclitem       datacl[1];    /* access permissions (VAR LENGTH) */

} FormData_pg_database;

 

/* ----------------

 *     Form_pg_databasecorresponds to a pointer to a tuple with

 *     theformat of pg_database relation.

 * ----------------

 */

typedef FormData_pg_database *Form_pg_database;

 

 

 

/* ----------------

 *     pg_authiddefinition.  cpp turns this into

 *     typedefstruct FormData_pg_authid

 * ----------------

 */

#define AuthIdRelationId 1260

#define AuthIdRelation_Rowtype_Id  2842

 

CATALOG(pg_authid,1260)BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO

{

    NameData   rolname;      /* name of role */

    bool       rolsuper;     /* read this field via superuser() only! */

    bool       rolinherit;       /* inherit privileges from other roles? */

    bool       rolcreaterole;    /* allowed to create more roles? */

    bool       rolcreatedb;  /* allowed to create databases? */

    bool       rolcatupdate; /* allowed to alter catalogs manually? */

    bool       rolcanlogin;  /* allowed to log in as session user? */

    bool       rolreplication; /* role used for streaming replication */

    int4       rolconnlimit; /* max connections allowed (-1=no limit) */

 

    /* remaining fields may be null; use heap_getattr to read them! */

    text       rolpassword;  /* password, if any */

    timestamptz rolvaliduntil;  /* password expiration time, if any */

} FormData_pg_authid;

 

#undef timestamptz

 

 

/* ----------------

 *     Form_pg_authidcorresponds to a pointer to a tuple with

 *     theformat of pg_authid relation.

 * ----------------

 */

typedef FormData_pg_authid *Form_pg_authid;

 

 

 

/* ----------------

 *     pg_auth_membersdefinition.  cpp turns this into

 *     typedefstruct FormData_pg_auth_members

 * ----------------

 */

#define AuthMemRelationId   1261

#define AuthMemRelation_Rowtype_Id 2843

 

CATALOG(pg_auth_members,1261)BKI_SHARED_RELATION BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(2843) BKI_SCHEMA_MACRO

{

    Oid        roleid;           /* ID of a role */

    Oid        member;           /* ID of a member of that role */

    Oid        grantor;      /* who granted the membership */

    bool       admin_option; /* granted with admin option? */

} FormData_pg_auth_members;

 

/* ----------------

 *     Form_pg_auth_memberscorresponds to a pointer to a tuple with

 *     theformat of pg_auth_members relation.

 * ----------------

 */

typedef FormData_pg_auth_members *Form_pg_auth_members;

 

就到这儿吧!


------------

blog.csdn.net/beiigang
beigang.iteye.com




Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk menyelesaikan masalah ralat permulaan aplikasi 0xc000012d Bagaimana untuk menyelesaikan masalah ralat permulaan aplikasi 0xc000012d Jan 02, 2024 pm 12:53 PM

Apabila komputer rakan kehilangan fail tertentu, aplikasi tidak boleh dimulakan seperti biasa dengan kod ralat 0xc000012d Malah, ia boleh diselesaikan dengan memuat turun semula fail dan memasangnya. Aplikasi tidak boleh bermula seperti biasa 0xc000012d: 1. Pertama, pengguna perlu memuat turun ".netframework". 2. Kemudian cari alamat muat turun dan muat turun ke komputer anda. 3. Kemudian klik dua kali pada desktop untuk mula berjalan. 4. Selepas pemasangan selesai, kembali ke lokasi program yang salah dan buka program semula.

Bagaimana untuk menyelesaikan gesaan komputer 'but semula dan pilih peranti but yang betul' Bagaimana untuk menyelesaikan gesaan komputer 'but semula dan pilih peranti but yang betul' Jan 15, 2024 pm 02:00 PM

Memasang semula sistem mungkin bukan penyelesaian yang mudah, tetapi selepas memasang semula, saya mendapati bahawa apabila komputer dihidupkan, ia akan memaparkan teks putih pada latar belakang hitam, dan kemudian memberikan gesaan: rebootandselectproperbootdevice, apa yang sedang berlaku? Gesaan sedemikian biasanya disebabkan oleh ralat but. Untuk membantu semua orang, editor telah membawakan anda penyelesaian. Penggunaan komputer menjadi semakin popular, dan kegagalan komputer menjadi semakin biasa Tidak, baru-baru ini beberapa pengguna menghadapi skrin hitam apabila menghidupkan komputer, dan menggesa Reboot dan Pilih peranti But Betul, dan sistem komputer tidak dapat dimulakan. biasalah. Apa yang berlaku? Bagaimana untuk menyelesaikannya? Pengguna keliru Seterusnya, editor akan mengikuti

Apakah yang perlu saya lakukan jika wps tidak dapat memulakan aplikasi sumber objek ini? Apakah yang perlu saya lakukan jika wps tidak dapat memulakan aplikasi sumber objek ini? Mar 13, 2024 pm 09:13 PM

WPS ialah perisian pejabat yang digunakan secara meluas, termasuk dokumen, borang dan PPT, serta menyokong penyegerakan berbilang terminal. Jika gesaan "Aplikasi sumber untuk objek ini tidak boleh dilancarkan" muncul semasa mengedit wps, bagaimana untuk menyelesaikannya? Masalah ini mungkin berlaku kerana anda cuba membuka pautan atau fail, tetapi aplikasi sumbernya tidak lagi wujud atau telah dipadamkan. Berikut ialah beberapa pembetulan: 1. Pasang semula perisian WPS: Cuba pasang semula WPSOffice untuk menyelesaikan masalah dan pastikan anda menggunakan versi terkini. 2. Tukar program lalai secara manual: Cuba tukar program lalai kepada WPS Anda boleh klik kanan fail yang ingin anda buka, pilih "Buka dengan", dan kemudian

Mana satu untuk dipilih semasa memulakan mesin kertas dinding? Mana satu untuk dipilih semasa memulakan mesin kertas dinding? Mar 19, 2024 am 08:49 AM

Apabila enjin kertas dinding dimulakan, terdapat 4 pilihan berbeza Ramai pengguna tidak tahu yang mana satu untuk dipilih semasa memulakan enjin kertas dinding Secara amnya, apabila enjin kertas dinding dimulakan, pilih yang pertama: mulakan 32-bit. Mana satu untuk dipilih semasa memulakan mesin kertas dinding? 1. Secara amnya, apabila enjin kertas dinding dimulakan, pilih yang pertama: mulakan 32-bit. 2. Apabila enjin kertas dinding dimulakan, terdapat 4 pilihan berbeza: mulakan 32-bit; 3. Mulakan 32-bit: Ini adalah pilihan umum yang disyorkan dan sesuai untuk kebanyakan pengguna. 4. Mulakan 64-bit: Jika sistem menyokong 64-bit, anda boleh memilih pilihan ini

Bagaimana untuk menetapkan keutamaan but sistem dwi Apple Bagaimana untuk menetapkan keutamaan but sistem dwi Apple Feb 19, 2024 pm 06:49 PM

Apabila teknologi terus berkembang, keperluan untuk menggunakan sistem pengendalian yang berbeza menjadi semakin biasa. Bagi pengguna Apple, kadangkala anda mungkin perlu memasang dan menggunakan dua sistem pengendalian berbeza pada satu peranti, seperti macOS dan Windows. Dalam kes ini, adalah amat penting untuk menetapkan urutan permulaan sistem dwi. Artikel ini akan memperkenalkan cara menyediakan peranti Apple untuk memulakan sistem dwi terlebih dahulu apabila menghidupkan peranti. Pertama, kita perlu memastikan bahawa kedua-dua sistem pengendalian telah berjaya dipasang pada peranti Apple. Anda boleh menggunakan BootCamp Apple ini

Bagaimana untuk membuka Perkhidmatan Sambungan Desktop Jauh menggunakan arahan Bagaimana untuk membuka Perkhidmatan Sambungan Desktop Jauh menggunakan arahan Dec 31, 2023 am 10:38 AM

Sambungan desktop jauh telah membawa kemudahan kepada kehidupan harian ramai pengguna Sesetengah orang ingin menggunakan arahan untuk menyambung dari jauh, yang mana lebih mudah untuk dikendalikan. Perkhidmatan Sambungan Desktop Jauh boleh membantu anda menyelesaikan masalah ini dengan menggunakan arahan untuk membukanya. Cara menyediakan arahan sambungan desktop jauh: Kaedah 1. Sambung dari jauh dengan menjalankan arahan 1. Tekan "Win+R" untuk membuka "Run" dan masukkan mstsc2, kemudian klik "Show Options" 3. Masukkan alamat IP dan klik "Sambung". 4. Ia akan menunjukkan bahawa ia bersambung. Kaedah 2: Sambung dari jauh melalui command prompt 1. Tekan "Win+R" untuk membuka "Run" dan masukkan cmd2 Dalam "Command Prompt" masukkan mstsc/v:192.168.1.250/console.

Apakah cara yang betul untuk memulakan semula perkhidmatan dalam Linux? Apakah cara yang betul untuk memulakan semula perkhidmatan dalam Linux? Mar 15, 2024 am 09:09 AM

Apakah cara yang betul untuk memulakan semula perkhidmatan dalam Linux? Apabila menggunakan sistem Linux, kami sering menghadapi situasi di mana kami perlu memulakan semula perkhidmatan tertentu, tetapi kadangkala kami mungkin menghadapi beberapa masalah semasa memulakan semula perkhidmatan, seperti perkhidmatan tidak benar-benar berhenti atau bermula. Oleh itu, adalah sangat penting untuk menguasai cara yang betul untuk memulakan semula perkhidmatan. Di Linux, anda biasanya boleh menggunakan perintah systemctl untuk mengurus perkhidmatan sistem. Perintah systemctl adalah sebahagian daripada pengurus sistem systemd

Penyelesaian kepada perkhidmatan PHP Ubuntu gagal dimulakan seperti biasa Penyelesaian kepada perkhidmatan PHP Ubuntu gagal dimulakan seperti biasa Feb 28, 2024 am 10:48 AM

Tajuk: Kaedah dan contoh kod khusus untuk menyelesaikan masalah yang perkhidmatan PHP tidak boleh dimulakan seperti biasa di bawah Ubuntu Apabila menggunakan Ubuntu untuk membina tapak web atau aplikasi, anda sering menghadapi masalah yang perkhidmatan PHP tidak dapat dimulakan secara normal, yang akan menyebabkan laman web tersebut. tidak dapat diakses secara normal atau aplikasi tidak dapat berfungsi dengan normal. Artikel ini akan memperkenalkan cara untuk menyelesaikan masalah yang perkhidmatan PHP tidak dapat dimulakan seperti biasa di bawah Ubuntu, dan memberikan contoh kod khusus untuk membantu pembaca menyelesaikan kegagalan tersebut dengan cepat. 1. Semak fail konfigurasi PHP Mula-mula, kita perlu menyemak fail konfigurasi PHP

See all articles