10.1 如何設(shè)置數(shù)據(jù)庫(kù)參數(shù)
所有的參數(shù)的名稱都是不區(qū)分大小寫的。每個(gè)參數(shù)的取值是布爾型、整型、浮點(diǎn)型和字符串型這四種類型中的一個(gè),分別用boolean、integer、floating point和string表示。布爾型的值可以寫成ON、OFF、 TRUE、 FALSE、 YES、 NO、 1和 0,而且不區(qū)分大小寫。
有些參數(shù)用來配置內(nèi)存大小和時(shí)間值。內(nèi)存大小的單位可以是KB、MB和GB。時(shí)間的單位可以是毫秒、秒、分鐘、小時(shí)和天。用ms表示毫秒,用s表示秒,用min表示分鐘,用h表示小時(shí),用d表示天。表示內(nèi)存大小和時(shí)間值的參數(shù)參數(shù)都有一個(gè)默認(rèn)的單位,如果用戶在設(shè)置參數(shù)的值時(shí)沒有指定單位,則以參數(shù)默認(rèn)的單位為準(zhǔn)。例如,參數(shù)shared_buffers表示數(shù)據(jù)緩沖區(qū)的大小,它的默認(rèn)單位是數(shù)據(jù)塊的個(gè)數(shù),如果把它的值設(shè)成8,因?yàn)槊總€(gè)數(shù)據(jù)塊的大小是8KB,則數(shù)據(jù)緩沖區(qū)的大小是8*8=64KB,如果將它的值設(shè)成128MB,則數(shù)據(jù)緩沖區(qū)的大小是128MB。參數(shù)vacuum_cost_delay的默認(rèn)單位是毫秒,如果把它的值設(shè)成10,則它的值是10毫秒,如果把它的值設(shè)成100s,則它的值是100秒。
所有的參數(shù)都放在文件 postgresql.conf中,下面是一個(gè)文件實(shí)例:
#這是注釋
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
每一行只能指定一個(gè)參數(shù),空格和空白行都會(huì)被忽略。“ #”表示注釋,注釋信息不用單獨(dú)占一行,可以出現(xiàn)在配置文件的任何地方。如果參數(shù)的值不是簡(jiǎn)單的標(biāo)識(shí)符和數(shù)字,應(yīng)該用單引號(hào)引起來。如果參數(shù)的值中有單引號(hào),應(yīng)該寫兩個(gè)單引號(hào),或者在單引號(hào)前面加一個(gè)反斜杠。
一個(gè)配置文件也可以包含其它配置文件,使用include指令能夠達(dá)到這個(gè)目的,例如,假設(shè)postgresql.conf文件中有下面一行:
include ‘my.confg’
文件my.config中的配置信息也會(huì)被數(shù)據(jù)庫(kù)讀入。include指令指定的配置文件也可以用include指令再包含其它配置文件。如果include指令中指定的文件名不是絕對(duì)路徑,數(shù)據(jù)庫(kù)會(huì)在postgresql.conf文件所在的目錄下查找這個(gè)文件。
用戶也可以在數(shù)據(jù)庫(kù)啟動(dòng)以后修改postgresql.conf配置文件,使用命令pg_ctl reload來通知數(shù)據(jù)庫(kù)重新讀取配置文件。注意,有些參數(shù)在數(shù)據(jù)庫(kù)啟動(dòng)以后,不能被修改,只有重新啟動(dòng)數(shù)據(jù)庫(kù)以后,新的參數(shù)值才能生效。另外一些參數(shù)可以在數(shù)據(jù)庫(kù)運(yùn)行過程中被修改而且新的值可以立即生效。所以數(shù)據(jù)庫(kù)在運(yùn)行過程中重新讀取參數(shù)配置文件以后,不是所有的參數(shù)都會(huì)被賦給新的值。
用戶可以在自己建立的會(huì)話中執(zhí)行命令SET修改某些配置參數(shù)的值(注意不是全部參數(shù)),例如:
SET ENABLE_SEQSCAN TO OFF;
另外,有些參數(shù)只有數(shù)據(jù)庫(kù)超級(jí)用戶才能使用SET命令修改它們。用戶可以在psql中執(zhí)行命令show來查看所有的數(shù)據(jù)庫(kù)參數(shù)的當(dāng)前值。例如:
(1)show all; --查看所有數(shù)據(jù)庫(kù)參數(shù)的值
(2)show search_path; --查看參數(shù)search_path的值
10.2 連接與認(rèn)證
10.2.1 連接設(shè)置
listen_addresses (string)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它指定數(shù)據(jù)庫(kù)用來監(jiān)聽客戶端連接的TCP/IP地址。默認(rèn)是值是* ,表示數(shù)據(jù)庫(kù)在啟動(dòng)以后將在運(yùn)行數(shù)據(jù)的機(jī)器上的所有的IP地址上監(jiān)聽用戶請(qǐng)求(如果機(jī)器只有一個(gè)網(wǎng)卡,只有一個(gè)IP地址,有多個(gè)網(wǎng)卡的機(jī)器有多個(gè) IP地址)??梢詫懗蓹C(jī)器的名字,也可以寫成IP地址,不同的值用逗號(hào)分開,例如,’server01’, ’140.87.171.49, 140.87.171.21’。如果被設(shè)成localhost,表示數(shù)據(jù)庫(kù)只能接受本地的客戶端連接請(qǐng)求,不能接受遠(yuǎn)程的客戶端連接請(qǐng)求。
port (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它指定數(shù)據(jù)庫(kù)監(jiān)聽?wèi)舳诉B接的TCP端口。默認(rèn)值是5432。
max_connections (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它決定數(shù)據(jù)庫(kù)可以同時(shí)建立的最大的客戶端連接的數(shù)目。默認(rèn)值是100。
superuser_reserved_connections (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它表示預(yù)留給超級(jí)用戶的數(shù)據(jù)庫(kù)連接數(shù)目。它的值必須小于max_connections。 普通用戶可以在數(shù)據(jù)庫(kù)中建立的最大的并發(fā)連接的數(shù)目是max_connections- superuser_reserved_connections, 默認(rèn)值是3。
unix_socket_group (string)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。設(shè)置Unix-domain socket所在的操作系統(tǒng)用戶組。默認(rèn)值是空串,用啟動(dòng)數(shù)據(jù)庫(kù)的操作系統(tǒng)用戶所在的組作為Unix-domain socket的用戶組。
unix_socket_permissions (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它設(shè)置Unix-domain socket的訪問權(quán)限,格式與操作系統(tǒng)的文件訪問權(quán)限是一樣的。默認(rèn)值是0770,表示任何操作系統(tǒng)用戶都能訪問Unix-domain socket。可以設(shè)為0770(所有Unix-domain socket文件的所有者所在的組包含的用戶都能訪問)和0700(只有Unix-domain socket文件的所有者才能訪問)。對(duì)于Unix-domain socket,只有寫權(quán)限才有意義,讀和執(zhí)行權(quán)限是沒有意義的。
tcp_keepalives_idle (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是0,意思是使用操作系統(tǒng)的默認(rèn)值。它設(shè)置TCP套接字的TCP_KEEPIDLE屬性。這個(gè)參數(shù)對(duì)于通過Unix-domain socket建立的數(shù)據(jù)庫(kù)連接沒有任何影響。
tcp_keepalives_interval (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是0,意思是使用操作系統(tǒng)的默認(rèn)值。它設(shè)置TCP套接字的TCP_KEEPINTVL屬性。這個(gè)參數(shù)對(duì)于通過Unix-domain socket建立的數(shù)據(jù)庫(kù)連接沒有任何影響。
tcp_keepalives_count (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是0,意思是使用操作系統(tǒng)的默認(rèn)值。它設(shè)置TCP套接字的TCP_KEEPCNT屬性。這個(gè)參數(shù)對(duì)于通過Unix-domain socket建立的數(shù)據(jù)庫(kù)連接沒有任何影響。
10.2.2. 安全與認(rèn)證
authentication_timeout (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置,它指定一個(gè)時(shí)間長(zhǎng)度,在這個(gè)時(shí)間長(zhǎng)度內(nèi),必須完成客戶端認(rèn)證操作,否則客戶端連接請(qǐng)求將被拒絕。它可以阻止某些客戶端進(jìn)行認(rèn)證時(shí)長(zhǎng)時(shí)間占用數(shù)據(jù)庫(kù)連接。單位是秒,默認(rèn)值是60。
ssl (boolean)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。決定數(shù)據(jù)庫(kù)是否接受SSL連接。默認(rèn)值是off。
ssl_ciphers (string)
指定可以使用的SSL加密算法。查看操作系統(tǒng)關(guān)于openssl的用戶手冊(cè)可以得到完整的加密算法列表(執(zhí)行命令openssl ciphers –v也可以得到)。
10.3 資源消耗
10.3.1 內(nèi)存
shared_buffers (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它表示數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊的個(gè)數(shù),每個(gè)數(shù)據(jù)塊的大小是8KB。數(shù)據(jù)緩沖區(qū)位于數(shù)據(jù)庫(kù)的共享內(nèi)存中,它越大越好,不能小于128KB。默認(rèn)值是1024。
temp_buffers (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是8MB。它決定存放臨時(shí)表的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊的個(gè)數(shù),每個(gè)數(shù)據(jù)塊的大小是8KB。臨時(shí)表緩沖區(qū)存放在每個(gè)數(shù)據(jù)庫(kù)進(jìn)程的私有內(nèi)存中,而不是存放在數(shù)據(jù)庫(kù)的共享內(nèi)存中。默認(rèn)值是1024。
max_prepared_transactions (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它決定能夠同時(shí)處于prepared狀態(tài)的事務(wù)的最大數(shù)目(參考PREPARE TRANSACTION命令)。如果它的值被設(shè)為0。則將數(shù)據(jù)庫(kù)將關(guān)閉prepared事務(wù)的特性。它的值通常應(yīng)該和max_connections的值一樣大。默認(rèn)值是5。
work_mem (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。它決定數(shù)據(jù)庫(kù)的排序操作和哈希表使用的內(nèi)存緩沖區(qū)的大小。如何work_mem指定的內(nèi)存被耗盡,數(shù)據(jù)庫(kù)將使用磁盤文件進(jìn)行完成操作,速度會(huì)慢很多。ORDER BY、DISTINCT和merge連接會(huì)使用排序操作。哈希表在Hash連接、hash聚集函數(shù)和用哈希表來處理IN謂詞中的子查詢中被使用。單位是KB,默認(rèn)值是1024。
maintenance_work_mem (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。它決定數(shù)據(jù)庫(kù)的維護(hù)操作使用的內(nèi)存空間的大小。數(shù)據(jù)庫(kù)的維護(hù)操作包括VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY等操作。 maintenance_work_mem的值如果比較大,通常可以縮短VACUUM數(shù)據(jù)庫(kù)和從dump文件中恢復(fù)數(shù)據(jù)庫(kù)需要的時(shí)間。maintenance_work_mem存放在每個(gè)數(shù)據(jù)庫(kù)進(jìn)程的私有內(nèi)存中,而不是存放在數(shù)據(jù)庫(kù)的共享內(nèi)存中。單位是KB,默認(rèn)值是16384。
max_stack_depth (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置,但只有數(shù)據(jù)庫(kù)超級(jí)用戶才能修改它。它決定一個(gè)數(shù)據(jù)庫(kù)進(jìn)程在運(yùn)行時(shí)的STACK所占的空間的最大值。數(shù)據(jù)庫(kù)進(jìn)程在運(yùn)行時(shí),會(huì)自動(dòng)檢查自己的STACK大小是否超過max_stack_depth,如果超過,會(huì)自動(dòng)終止當(dāng)前事務(wù)。這個(gè)值應(yīng)該比操作系統(tǒng)設(shè)置的進(jìn)程STACK的大小的上限小1MB。使用操作系統(tǒng)命令“ulimit –s“可以得到操作系統(tǒng)設(shè)置的進(jìn)程STACK的最大值。單位是KB,默認(rèn)值是100。
10.3.2 Free Space Map
數(shù)據(jù)庫(kù)的所有可用空間信息都存放在一個(gè)叫free space map (FSM)的結(jié)構(gòu)中,它記載數(shù)據(jù)文件中每個(gè)數(shù)據(jù)塊的可用空間的大小。FSM中沒有記錄的數(shù)據(jù)塊,即使有可用空間,也不會(huì)系統(tǒng)使用。系統(tǒng)如果需要新的物理存儲(chǔ)空間,會(huì)首先在FSM中查找,如果FSM中沒有一個(gè)數(shù)據(jù)頁有足夠的可用空間,系統(tǒng)就會(huì)自動(dòng)擴(kuò)展數(shù)據(jù)文件。所以,F(xiàn)SM如果太小,會(huì)導(dǎo)致系統(tǒng)頻繁地?cái)U(kuò)展數(shù)據(jù)文件,浪費(fèi)物理存儲(chǔ)空間。命令VACUUM VERBOSE在執(zhí)行結(jié)束以后,會(huì)提示當(dāng)前的FSM設(shè)置是否滿足需要,如果FSM的參數(shù)值太小,它會(huì)提示增大參數(shù)。
FSM存放在數(shù)據(jù)庫(kù)的共享內(nèi)存中,由于物理內(nèi)存的限制,F(xiàn)SM不可能跟蹤數(shù)據(jù)庫(kù)的所有的數(shù)據(jù)文件的所有數(shù)據(jù)塊的可用空間信息,只能跟蹤一部分?jǐn)?shù)據(jù)塊的可用空間信息。
max_fsm_relations (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。默認(rèn)值是1000。它決定FSM跟蹤的表和索引的個(gè)數(shù)的上限。每個(gè)表和索引在FSM中占7個(gè)字節(jié)的存儲(chǔ)空間。
max_fsm_pages (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它決定FSM中跟蹤的數(shù)據(jù)塊的個(gè)數(shù)的上限。initdb在創(chuàng)建數(shù)據(jù)庫(kù)集群時(shí)會(huì)根據(jù)物理內(nèi)存的大小決定它的值。每個(gè)數(shù)據(jù)塊在fsm中占6個(gè)字節(jié)的存儲(chǔ)空間。它的大小不能小于16 * max_fsm_relations。默認(rèn)值是20000。
10.3.3 內(nèi)核資源
max_files_per_process (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。他設(shè)定每個(gè)數(shù)據(jù)庫(kù)進(jìn)程能夠打開的文件的數(shù)目。默認(rèn)值是1000。
shared_preload_libraries (string)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。它設(shè)置數(shù)據(jù)庫(kù)在啟動(dòng)時(shí)要加載的操作系統(tǒng)共享庫(kù)文件。如果有多個(gè)庫(kù)文件,名字用逗號(hào)分開。如果數(shù)據(jù)庫(kù)在啟動(dòng)時(shí)未找到shared_preload_libraries指定的某個(gè)庫(kù)文件,數(shù)據(jù)庫(kù)將無法啟動(dòng)。默認(rèn)值為空串。
10.3.4 垃圾收集
執(zhí)行VACUUM 和ANALYZE命令時(shí),因?yàn)樗鼈儠?huì)消耗大量的CPU與IO資源,而且執(zhí)行一次要花很長(zhǎng)時(shí)間,這樣會(huì)干擾系統(tǒng)執(zhí)行應(yīng)用程序發(fā)出的SQL命令。為了解決這個(gè)問題,VACUUM 和ANALYZE命令執(zhí)行一段時(shí)間后,系統(tǒng)會(huì)暫時(shí)終止它們的運(yùn)行,過一段時(shí)間后再繼續(xù)執(zhí)行這兩個(gè)命令。這個(gè)特性在默認(rèn)的情況下是關(guān)閉的。將參數(shù)vacuum_cost_delay設(shè)為一個(gè)非零的正整數(shù)就可以打開這個(gè)特性。
用戶通常只需要設(shè)置參數(shù)vacuum_cost_delay和vacuum_cost_limit,其它的參數(shù)使用默認(rèn)值即可。VACUUM 和ANALYZE命令在執(zhí)行過程中,系統(tǒng)會(huì)計(jì)算它們執(zhí)行消耗的資源,資源的數(shù)量用一個(gè)正整數(shù)表示,如果資源的數(shù)量超過vacuum_cost_limit,則執(zhí)行命令的進(jìn)程會(huì)進(jìn)入睡眠狀態(tài),睡眠的時(shí)間長(zhǎng)度是是vacuum_cost_delay。vacuum_cost_limit的值越大,VACUUM 和ANALYZE命令在執(zhí)行的過程中,睡眠的次數(shù)就越少,反之,vacuum_cost_limit的值越小,VACUUM 和ANALYZE命令在執(zhí)行的過程中,睡眠的次數(shù)就越多。
vacuum_cost_delay (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是0。它決定執(zhí)行VACUUM 和ANALYZE命令的進(jìn)程的睡眠時(shí)間。單位是微秒。它的值最好是10的整數(shù),如果不是10的整數(shù),系統(tǒng)會(huì)自動(dòng)將它設(shè)為比該值大的并且最接近該值的是10的倍數(shù)的整數(shù)。如果值是0,VACUUM 和ANALYZE命令在執(zhí)行過程中不會(huì)主動(dòng)進(jìn)入睡眠狀態(tài),會(huì)一直執(zhí)行下去直到結(jié)束。
vacuum_cost_page_hit (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是1。
vacuum_cost_page_miss (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是10。
vacuum_cost_page_dirty (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是20。
vacuum_cost_limit (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。默認(rèn)值是200。
10.3.5 后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程
后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程負(fù)責(zé)將數(shù)據(jù)緩沖區(qū)中的被修改的數(shù)據(jù)塊(又叫臟數(shù)據(jù)塊)寫回到數(shù)據(jù)庫(kù)物理文件中。
bgwriter_delay (integer)
這個(gè)參數(shù)只能在文件postgresql.conf中設(shè)置。它決定后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程的睡眠時(shí)間。后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程每次完成寫數(shù)據(jù)到物理文件中的任務(wù)以后,就會(huì)睡眠bgwriter_delay指定的時(shí)間。 bgwriter_delay的值應(yīng)該是10的倍數(shù),如果用戶設(shè)定的值不是10的倍數(shù),數(shù)據(jù)庫(kù)會(huì)自動(dòng)將參數(shù)的值設(shè)為比用戶指定的值大的最接近用戶指定的值的同時(shí)是10的倍數(shù)的值。單位是毫秒,默認(rèn)值是200。
bgwriter_lru_maxpages (integer)
這個(gè)參數(shù)只能在文件postgresql.conf中設(shè)置。默認(rèn)值是100。后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程每次寫臟數(shù)據(jù)塊時(shí),寫到外部文件中的臟數(shù)據(jù)塊的個(gè)數(shù)不能超過bgwriter_lru_maxpages指定的值。例如,如果它的值是500,則后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程每次寫到物理文件的數(shù)據(jù)頁的個(gè)數(shù)不能超過500,若超過,進(jìn)程將進(jìn)入睡眠狀態(tài),等下次醒來再執(zhí)行寫物理文件的任務(wù)。如果它的值被設(shè)為0, 后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程將不會(huì)寫任何物理文件(但還會(huì)執(zhí)行檢查點(diǎn)操作)。
bgwriter_lru_multiplier (floating point)
這個(gè)參數(shù)只能在文件postgresql.conf中設(shè)置。默認(rèn)值是2.0。它決定后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程每次寫物理文件時(shí),寫到外部文件中的臟數(shù)據(jù)塊的個(gè)數(shù)(不能超過bgwriter_lru_maxpages指定的值)。一般使用默認(rèn)值即可,不需要修改這個(gè)參數(shù)。這個(gè)參數(shù)的值越大,后臺(tái)寫數(shù)據(jù)庫(kù)進(jìn)程每次寫的臟數(shù)據(jù)塊的個(gè)數(shù)就越多。
10.4 事務(wù)日志
full_page_writes (boolean)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。默認(rèn)值是on。打開這個(gè)參數(shù),可以提高數(shù)據(jù)庫(kù)的可靠性,減少數(shù)據(jù)丟失的概率,但是會(huì)產(chǎn)生過多的事務(wù)日志,降低數(shù)據(jù)庫(kù)的性能。
wal_buffers (integer)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。默認(rèn)值是8。它指定事務(wù)日志緩沖區(qū)中包含的數(shù)據(jù)塊的個(gè)數(shù),每個(gè)數(shù)據(jù)塊的大小是8KB,所以默認(rèn)的事務(wù)日志緩沖區(qū)的大小是8*8=64KB。事務(wù)日志緩沖區(qū)位于數(shù)據(jù)庫(kù)的共享內(nèi)存中。
wal_writer_delay (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。它決定寫事務(wù)日志進(jìn)程的睡眠時(shí)間。WAL進(jìn)程每次在完成寫事務(wù)日志的任務(wù)后,就會(huì)睡眠wal_writer_delay指定的時(shí)間,然后醒來,繼續(xù)將新產(chǎn)生的事務(wù)日志從緩沖區(qū)寫到WAL文件中。單位是毫秒(millisecond),默認(rèn)值是200。
commit_delay (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。它設(shè)定事務(wù)在發(fā)出提交命令以后的睡眠時(shí)間,只有在睡眠了commit_delay指定的時(shí)間以后,事務(wù)產(chǎn)生的事務(wù)日志才會(huì)被寫到事務(wù)日志文件中,事務(wù)才能真正地提交。增大這個(gè)參數(shù)會(huì)增加用戶的等待時(shí)間,但是可以讓多個(gè)事務(wù)被同時(shí)提交,提高系統(tǒng)的性能。如果數(shù)據(jù)庫(kù)中的負(fù)載比較高,而且大部分事務(wù)都是更新類型的事務(wù),可以考慮增大這個(gè)參數(shù)的值。下面的參數(shù)commit_siblings會(huì)影響commit_delay是否生效。默認(rèn)值是0,單位是微秒(microsecond)。
commit_siblings (integer)
這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。這個(gè)參數(shù)的值決定參數(shù)commit_delay是否生效。假設(shè)commit_siblings的值是5,如果一個(gè)事務(wù)發(fā)出一個(gè)提交請(qǐng)求,此時(shí),如果數(shù)據(jù)庫(kù)中正在執(zhí)行的事務(wù)的個(gè)數(shù)大于或等于5,那么該事務(wù)將睡眠commit_delay指定的時(shí)間。如果數(shù)據(jù)庫(kù)中正在執(zhí)行的事務(wù)的個(gè)數(shù)小于5,這個(gè)事務(wù)將直接提交。默認(rèn)值是5。
10.5 檢查點(diǎn)
checkpoint_segments (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。默認(rèn)值是3。它影響系統(tǒng)何時(shí)啟動(dòng)一個(gè)檢查點(diǎn)操作。如果上次檢查點(diǎn)操作結(jié)束以后,系統(tǒng)產(chǎn)生的事務(wù)日志文件的個(gè)數(shù)超過checkpoint_segments的值,系統(tǒng)就會(huì)自動(dòng)啟動(dòng)一個(gè)檢查點(diǎn)操作。增大這個(gè)參數(shù)會(huì)增加數(shù)據(jù)庫(kù)崩潰以后恢復(fù)操作需要的時(shí)間。
checkpoint_timeout (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。單位是秒,默認(rèn)值是300。它影響系統(tǒng)何時(shí)啟動(dòng)一個(gè)檢查點(diǎn)操作。如果現(xiàn)在的時(shí)間減去上次檢查點(diǎn)操作結(jié)束的時(shí)間超過了checkpoint_timeout的值,系統(tǒng)就會(huì)自動(dòng)啟動(dòng)一個(gè)檢查點(diǎn)操作。增大這個(gè)參數(shù)會(huì)增加數(shù)據(jù)庫(kù)崩潰以后恢復(fù)操作需要的時(shí)間。
checkpoint_completion_target (floating point)
這個(gè)參數(shù)控制檢查點(diǎn)操作的執(zhí)行時(shí)間。合法的取值在0到1之間,默認(rèn)值是0.5。不要輕易地改變這個(gè)參數(shù)的值,使用默認(rèn)值即可。 這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
10.6 歸檔模式
archive_mode (boolean)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。默認(rèn)值是off。它決定數(shù)據(jù)庫(kù)是否打開歸檔模式。
archive_dir (string)
這個(gè)參數(shù)只有在啟動(dòng)數(shù)據(jù)庫(kù)時(shí),才能被設(shè)置。默認(rèn)值是空串。它設(shè)定存放歸檔事務(wù)日志文件的目錄。
archive_timeout (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。默認(rèn)值是0。單位是秒。如果archive_timeout的值不是0,而且當(dāng)前時(shí)間減去數(shù)據(jù)庫(kù)上次進(jìn)行事務(wù)日志文件切換的時(shí)間大于archive_timeout的值,數(shù)據(jù)庫(kù)將進(jìn)行一次事務(wù)日志文件切換。一般情況下,數(shù)據(jù)庫(kù)只有在一個(gè)事務(wù)日志文件寫滿以后,才會(huì)切換到下一個(gè)事務(wù)日志文件,設(shè)定這個(gè)參數(shù)可以讓數(shù)據(jù)庫(kù)在一個(gè)事務(wù)日志文件尚未寫滿的情況下切換到下一個(gè)事務(wù)日志文件。
10.7 優(yōu)化器參數(shù)
10.7.1 存取方法參數(shù)
下列參數(shù)控制查詢優(yōu)化器是否使用特定的存取方法。除非對(duì)優(yōu)化器特別了解,一般情況下,使用它們默認(rèn)值即可。
enable_bitmapscan (boolean)
打開或者關(guān)閉bitmap-scan 。默認(rèn)值是 on。
enable_hashagg (boolean)
打開或者關(guān)閉hashed aggregation。默認(rèn)值是 on。
enable_hashjoin (boolean)
打開或者關(guān)閉hash-join。默認(rèn)值是 on。
enable_indexscan (boolean)
打開或者關(guān)閉index-scan。默認(rèn)值是 on。
enable_mergejoin (boolean)
打開或者關(guān)閉merge-join。默認(rèn)值是 on。
enable_nestloop (boolean)
打開或者關(guān)閉nested-loop join。默認(rèn)值是 on。不可能完全不使用nested-loop join,關(guān)閉這個(gè)參數(shù)會(huì)讓系統(tǒng)在有其它存取方法可用的情況下,不使用nested-loop join。
enable_seqscan (boolean)
打開或者關(guān)閉sequential scan。默認(rèn)值是 on。不可能完全不使用sequential scan,關(guān)閉這個(gè)參數(shù)會(huì)讓系統(tǒng)在有其它存取方法可用的情況下,不使用sequential scan。
enable_sort (boolean)
打開或者關(guān)閉explicit sort。默認(rèn)值是 on。不可能完全不使用explicit sort,關(guān)閉這個(gè)參數(shù)會(huì)讓系統(tǒng)在有其它存取方法可用的情況下,不使用explicit sort。
enable_tidscan (boolean)
打開或者關(guān)閉TID scan。默認(rèn)值是 on。
10.7.2 優(yōu)化器成本常量
優(yōu)化器用一個(gè)正的浮點(diǎn)數(shù)來表示不同的查詢計(jì)劃的執(zhí)行成本,每個(gè)基本的數(shù)據(jù)庫(kù)操作都會(huì)被賦給一個(gè)確定的成本常量,優(yōu)化器根據(jù)每個(gè)基本操作的執(zhí)行成本來計(jì)算每個(gè)查詢計(jì)劃的執(zhí)行成本。不要輕易地改變下面的參數(shù)的值,使用它們的默認(rèn)值即可。
seq_page_cost (floating point)
設(shè)置從數(shù)據(jù)文件上順序讀取一個(gè)數(shù)據(jù)塊的執(zhí)行成本。默認(rèn)值是1.0。
random_page_cost (floating point)
設(shè)置從數(shù)據(jù)文件上隨機(jī)讀取一個(gè)數(shù)據(jù)塊的執(zhí)行成本。默認(rèn)值是4.0。
cpu_tuple_cost (floating point)
設(shè)置處理每一個(gè)數(shù)據(jù)行的執(zhí)行成本。默認(rèn)值是0.01。
cpu_index_tuple_cost (floating point)
設(shè)置在掃描索引的過程中處理每一個(gè)索引項(xiàng)的執(zhí)行成本。默認(rèn)值是0.005。
cpu_operator_cost (floating point)
設(shè)置處理每一個(gè)運(yùn)算符或函數(shù)的執(zhí)行成本。默認(rèn)值是0.0025。
effective_cache_size (integer)
設(shè)置單個(gè)查詢可以使用的數(shù)據(jù)緩沖區(qū)的大小。默認(rèn)值是128MB。
10.7.3 Genetic Query Optimizer
下列參數(shù)控制優(yōu)化器使用的遺傳算法。除非對(duì)遺傳算法特別了解,一般情況下,使用它們默認(rèn)值即可。
geqo (boolean)
打開或者關(guān)閉遺傳優(yōu)化器。默認(rèn)值是on。
geqo_threshold (integer)
確定使用遺傳優(yōu)化器的查詢類型。默認(rèn)值是12。如果FROM子句中引用的的表的數(shù)目超過geqo_threshold的值,就會(huì)使用遺傳優(yōu)化器。對(duì)于簡(jiǎn)單的查詢使用窮舉優(yōu)化器。
geqo_effort (integer)
控制遺傳優(yōu)化器在生成查詢計(jì)劃需要的時(shí)間和查詢計(jì)劃的有效性之間做一個(gè)折中。有效的取值范圍是1到 10。默認(rèn)值是5。值越大,優(yōu)化器花在選擇查詢計(jì)劃的上的時(shí)間越長(zhǎng),同時(shí)找到一個(gè)最優(yōu)的查詢計(jì)劃的可能性就越大。系統(tǒng)通常不直接使用geqo_effort的值,而是使用它的值來計(jì)算參數(shù)geqo_pool_size和geqo_generations的默認(rèn)。
geqo_pool_size (integer)
控制遺傳優(yōu)化器的池(pool)大小。默認(rèn)值是0。池大小是遺傳群體中的個(gè)體數(shù)目。至少是2,典型的取值在10和1000之間。如果參數(shù)的值是0,系統(tǒng)會(huì)自動(dòng)根據(jù)geqo_effort的值和查詢中引用的表的個(gè)數(shù)選擇一個(gè)默認(rèn)值。
geqo_generations (integer)
控制遺傳優(yōu)化器的代(generation)的大小。默認(rèn)值是0。代是遺傳算法的迭代次數(shù)。至少是1,典型的取值范圍與池的取值范圍相同。如果參數(shù)的值是0,系統(tǒng)會(huì)自動(dòng)根據(jù)geqo_pool_size的值和選擇一個(gè)默認(rèn)值。
geqo_selection_bias (floating point)
控制遺傳優(yōu)化器的代選擇偏差(selection bias)的大小。默認(rèn)值是2。取值范圍在1.50到2.00之間。
10.7.4 其它優(yōu)化器參數(shù)
default_statistics_target (integer)
設(shè)置默認(rèn)的收集優(yōu)化器統(tǒng)計(jì)數(shù)據(jù)的目標(biāo)值。它的值越大,ANALYZE操作的執(zhí)行的時(shí)間越長(zhǎng),掃描的數(shù)據(jù)行的個(gè)數(shù)也就越多,得到的優(yōu)化器統(tǒng)計(jì)數(shù)據(jù)就越準(zhǔn)確。也可以使用命令A(yù)LTER TABLE ... ALTER COLUMN ... SET STATISTICS來為表的每個(gè)列設(shè)置一個(gè)單獨(dú)的統(tǒng)計(jì)數(shù)據(jù)目標(biāo)值,這個(gè)值的作用與參數(shù)default_statistics_target是一樣,它只影響相關(guān)的列的統(tǒng)計(jì)數(shù)據(jù)收集過程。默認(rèn)值是10。
constraint_exclusion (boolean)
如果該參數(shù)的值是on,查詢優(yōu)化器將使用表上的約束條件來優(yōu)化查詢。如果它的值是off,查詢優(yōu)化器不會(huì)使用表上的約束條件來優(yōu)化查詢。默認(rèn)值是off。
10.8 數(shù)據(jù)庫(kù)運(yùn)行日志配置參數(shù)
log_directory (string)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。它決定存放數(shù)據(jù)庫(kù)運(yùn)行日志文件的目錄。默認(rèn)值是pg_log??梢允墙^對(duì)路徑,也可是相對(duì)路徑(相對(duì)于數(shù)據(jù)庫(kù)文件所在的路徑)。
log_filename (string)
它決定數(shù)據(jù)庫(kù)運(yùn)行日志文件的名稱。默認(rèn)值是postgresql-%Y-%m-%d_%H%M%S.log。它的值可以包含%Y、%m、%d、%H、%M和%S這樣的字符串,分別表示年、月、日、小時(shí)、分和秒。 如果參數(shù)的值中沒有指定時(shí)間信息(沒有出現(xiàn)%Y、%m、%d、%H、%M和%S中的任何一個(gè)),系統(tǒng)會(huì)自動(dòng)在log_filename值的末尾加上文件創(chuàng)建的時(shí)間作為文件名,例如,如果log_filename的值是 server_log,那么在Sun Aug 29 19:02:33 2004 MST被創(chuàng)建的日志文件的名稱將是server_log.1093827753,1093827753是Sun Aug 29 19:02:33 2004 MST在數(shù)據(jù)庫(kù)內(nèi)部的表示形式。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
log_rotation_age (integer)
它決定何時(shí)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)日志文件。單位是分鐘。默認(rèn)值是0。如果現(xiàn)在的時(shí)間減去上次創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)運(yùn)行日志的時(shí)間超過了log_rotation_age的值,數(shù)據(jù)庫(kù)將自動(dòng)創(chuàng)建一個(gè)新的運(yùn)行日志文件。如果它的值是0,該參數(shù)將不起任何作用。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
log_rotation_size (integer)
這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。它決定何時(shí)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)日志文件。單位是KB。默認(rèn)值是10240。如果一個(gè)日志文件寫入的數(shù)據(jù)量超過log_rotation_size的值,數(shù)據(jù)庫(kù)將創(chuàng)建一個(gè)新的日志文件。如果它的值被設(shè)為0,該參數(shù)將不起任何作用。
log_truncate_on_rotation (boolean)
系統(tǒng)在創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)運(yùn)行日志文件時(shí),如果發(fā)現(xiàn)存在一個(gè)同名的文件,當(dāng)log_truncate_on_rotation的值是on時(shí),系統(tǒng)覆蓋這個(gè)同名文件。當(dāng)log_truncate_on_rotation的值是off時(shí),系統(tǒng)將重用這個(gè)同名文件,在它的末尾添加新的日志信息。另外要注意的是,只有在因?yàn)閰?shù)log_rotation_age起作用系統(tǒng)才創(chuàng)建新的日志文件的情況下,才會(huì)覆蓋同名的日志文件。因?yàn)閿?shù)據(jù)庫(kù)重新啟動(dòng)或者因?yàn)閰?shù)log_rotation_size起作用而創(chuàng)建新的日志文件,不會(huì)覆蓋同名的日志文件,而是在同名的日志文件末尾添加新的日志信息。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。默認(rèn)值是off。
例如,將這個(gè)參數(shù)設(shè)為on,將log_rotation_age設(shè)為60,將同時(shí)將log_filename設(shè)為postgresql-%H.log,系統(tǒng)中一共將只有24個(gè)日志文件,它們會(huì)被不斷地重用,任何時(shí)刻,系統(tǒng)中最多只有最近24小時(shí)的日志信息。
client_min_messages (string)
控制發(fā)送給客戶端的消息級(jí)別。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING、ERROR、FATAL和PANIC,每個(gè)級(jí)別都包含排在它后面的所有級(jí)別中的信息。級(jí)別越低,發(fā)送給客戶端的消息就越少。 默認(rèn)值是NOTICE。這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。
log_min_messages (string)
控制寫到數(shù)據(jù)庫(kù)日志文件中的消息的級(jí)別。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、 LOG、FATAL和PANIC,每個(gè)級(jí)別都包含排在它后面的所有級(jí)別中的信息。級(jí)別越低,數(shù)據(jù)庫(kù)運(yùn)行日志中記錄的消息就越少。默認(rèn)值是NOTICE。只有超級(jí)用戶才能修改這個(gè)參數(shù)。只有超級(jí)用戶才能設(shè)置這個(gè)參數(shù)。
log_error_verbosity (string)
控制每條日志信息的詳細(xì)程度。合法的取值是TERSE、DEFAULT和VERBOSE(每個(gè)取值都比它前面的取值提供更詳細(xì)的信息)。只有超級(jí)用戶才能修改這個(gè)參數(shù)。默認(rèn)值是DEFAULT。
log_min_error_statement (string)
控制日志中是否記錄導(dǎo)致數(shù)據(jù)庫(kù)出現(xiàn)錯(cuò)誤的SQL語句。合法的取值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、 LOG、FATAL和PANIC,每個(gè)級(jí)別都包含排在它后面的所有級(jí)別。默認(rèn)值是ERROR。只有超級(jí)用戶才能修改這個(gè)參數(shù)。
表 10-1. 消息嚴(yán)重級(jí)別
嚴(yán)重級(jí)別
用法
DEBUG1..DEBUG5
報(bào)告詳細(xì)的調(diào)試信息。
INFO
報(bào)告用戶可能需要的信息。
NOTICE
報(bào)告對(duì)用戶有用的信息。
WARNING
報(bào)告警告信息。
ERROR
報(bào)告錯(cuò)誤信息。
LOG
報(bào)告對(duì)數(shù)據(jù)庫(kù)管理員有用的信息, 例如,檢查點(diǎn)操作統(tǒng)計(jì)信息。
FATAL
報(bào)告導(dǎo)致當(dāng)前會(huì)話被終止的錯(cuò)誤信息。
PANIC
報(bào)告導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)被關(guān)閉的錯(cuò)誤信息。
debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
debug_pretty_print (boolean)
這些參數(shù)控制數(shù)據(jù)庫(kù)是否輸出運(yùn)行時(shí)的調(diào)試信息。這些參數(shù)的默認(rèn)值是off。這些參數(shù)可以被任何用戶設(shè)置。
log_checkpoints (boolean)
控制是否及記錄檢查點(diǎn)操作信息。默認(rèn)值是off。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。必須重啟數(shù)據(jù)庫(kù)才能生效。
log_connections (boolean)
控制是否及記錄客戶端連接請(qǐng)求信息。默認(rèn)值是off。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。必須重啟數(shù)據(jù)庫(kù)才能生效。
log_disconnections (boolean)
控制是否記錄客戶端結(jié)束連接信息。默認(rèn)值是off。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
log_duration (boolean)
控制是否記錄每個(gè)完成的SQL語句的執(zhí)行時(shí)間。只有超級(jí)用戶才能修改這個(gè)參數(shù)。默認(rèn)值是off。對(duì)于使用擴(kuò)展協(xié)議與數(shù)據(jù)庫(kù)通信的客戶端,會(huì)記載Parse、Bind和Execute的執(zhí)行時(shí)間。
log_hostname (boolean)
控制是否及記錄客戶端的主機(jī)名。默認(rèn)值是off。如果設(shè)為on,可能會(huì)影響數(shù)據(jù)庫(kù)的性能,因?yàn)榻馕鲋鳈C(jī)名可能需要一定的時(shí)間。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
log_line_prefix (string)
控制每條日志信息的前綴格式。默認(rèn)值是空串。它的格式類似c語言中printf函數(shù)的format字符串。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
轉(zhuǎn)義序列
含義
%u
用戶名
%d
數(shù)據(jù)庫(kù)名
%r
客戶端機(jī)器名或IP地址,還有客戶端端口
%h
客戶端機(jī)器名或IP地址
%p
進(jìn)程ID
%t
帶微秒的時(shí)間
%m
不帶微秒的時(shí)間
%i
命令標(biāo)簽: 會(huì)話當(dāng)前執(zhí)行的命令類型
%c
會(huì)話ID
%l
每個(gè)會(huì)話的日志編號(hào),從1開始
%s
進(jìn)程啟動(dòng)時(shí)間
%v
虛擬事務(wù)ID (backendID/localXID)
%x
事務(wù)ID (0表示沒有分配事務(wù)ID)
%q
不產(chǎn)生任何輸出。如果當(dāng)前進(jìn)程是backend進(jìn)程,忽略這個(gè)轉(zhuǎn)義序列,繼續(xù)處理后面的轉(zhuǎn)義序列。如果當(dāng)前進(jìn)程不是backend進(jìn)程,
忽略這個(gè)轉(zhuǎn)義序列和它后面的所有轉(zhuǎn)義序列。
%%
字符%
log_lock_waits (boolean)
如果一個(gè)會(huì)話等待某個(gè)類型的鎖的時(shí)間超過deadlock_timeout的值,該參數(shù)決定是否在數(shù)據(jù)庫(kù)日志中記錄這個(gè)信息。默認(rèn)值是off。只有超級(jí)用戶才能修改這個(gè)參數(shù)。
log_statement (string)
控制記錄哪種SQL語句的執(zhí)行信息。有效的取值是none、ddl、mod和all。默認(rèn)值是none。ddl包括所有數(shù)據(jù)定義語句,如CREATE、ALTER和DROP語句。mod包括所有ddl語句和更新數(shù)據(jù)的語句,例如INSERT、UPDATE、DELETE、TRUNCATE、 COPY FROM、PREPARE和 EXECUTE。All包括所有的語句。只有超級(jí)用戶才能修改這個(gè)參數(shù)。
log_temp_files (integer)
控制是否記錄臨時(shí)文件的刪除信息。單位是KB。0表示記錄所有臨時(shí)文件的刪除信息。正整數(shù)表示只記錄大小比log_temp_files的值大的臨時(shí)文件的刪除信息。-1表示不記錄任何臨時(shí)文件刪除信息。默認(rèn)值是-1。這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。
log_timezone (string)
設(shè)置數(shù)據(jù)庫(kù)日志文件在寫日志文件時(shí)使用的時(shí)區(qū)。默認(rèn)值是unknown,意識(shí)是使用操作系統(tǒng)的時(shí)區(qū)。這個(gè)參數(shù)只能在postgresql.conf文件中被設(shè)置。
10.9 數(shù)據(jù)庫(kù)運(yùn)行統(tǒng)計(jì)數(shù)據(jù)相關(guān)參數(shù)
下面的參數(shù)控制是否搜集特定的數(shù)據(jù)庫(kù)運(yùn)行統(tǒng)計(jì)數(shù)據(jù):
track_activities (boolean)
是否收集每個(gè)會(huì)話的當(dāng)前正在執(zhí)行的命令的統(tǒng)計(jì)數(shù)據(jù),包括命令開始執(zhí)行的時(shí)間。默認(rèn)值是on。只有超級(jí)用戶才能修改這個(gè)參數(shù)。
track_counts (boolean)
是否收集數(shù)據(jù)庫(kù)活動(dòng)的統(tǒng)計(jì)數(shù)據(jù)。默認(rèn)值是on。只有超級(jí)用戶才能修改這個(gè)參數(shù)。
log_statement_stats (boolean)
log_parser_stats (boolean)
log_planner_stats (boolean)
log_executor_stats (boolean)
這些參數(shù)決定是否在數(shù)據(jù)庫(kù)的運(yùn)行日志里記載每個(gè)SQL語句執(zhí)行的統(tǒng)計(jì)數(shù)據(jù)。如果log_statement_stats的值是on,其它的三個(gè)參數(shù)的值必須是off。所有的這些參數(shù)的默認(rèn)值都是off。log_statement_stats報(bào)告整個(gè)語句的統(tǒng)計(jì)數(shù)據(jù),log_parser_stats記載數(shù)據(jù)庫(kù)解析器的統(tǒng)計(jì)數(shù)據(jù),log_planner_stats報(bào)告數(shù)據(jù)庫(kù)查詢優(yōu)化器的統(tǒng)計(jì)數(shù)據(jù),log_executor_stats報(bào)告數(shù)據(jù)庫(kù)執(zhí)行器的統(tǒng)計(jì)數(shù)據(jù)。只有超級(jí)用戶才能修改這些參數(shù)。
10.10 自動(dòng)垃圾收集相關(guān)參數(shù)
下面的參數(shù)控制自動(dòng)垃圾收集的行為:
autovacuum (boolean)
控制是夠打開數(shù)據(jù)庫(kù)的自動(dòng)垃圾收集功能。默認(rèn)值是on。如果autovacuum被設(shè)為on,參數(shù)track_counts(參考本章10.9)也要被設(shè)為on,自動(dòng)垃圾收集才能正常工作。注意,即使這個(gè)參數(shù)被設(shè)為off,如果事務(wù)ID回繞即將發(fā)生,數(shù)據(jù)庫(kù)會(huì)自動(dòng)啟動(dòng)一個(gè)垃圾收集操作。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。
log_autovacuum_min_duration (integer)
單位是毫秒。如果它的值為0,所有的垃圾搜集操作都會(huì)被記錄在數(shù)據(jù)庫(kù)運(yùn)行日志中,如果它的值是-1,所有的垃圾收集操作都不會(huì)被記錄在數(shù)據(jù)庫(kù)運(yùn)行日志中。如果把它的值設(shè)為250毫秒,只要自動(dòng)垃圾搜集發(fā)出的VACUUM和ANALYZE命令的執(zhí)行時(shí)間超過250毫秒,VACUUM和ANALYZE命令的相關(guān)信息就會(huì)被記錄在數(shù)據(jù)庫(kù)運(yùn)行日志中。默認(rèn)值是-1。這個(gè)參數(shù)只能在 postgresql.conf中被設(shè)置。
autovacuum_max_workers (integer)
設(shè)置能同時(shí)運(yùn)行的最大的自動(dòng)垃圾收集工作進(jìn)程的數(shù)目。默認(rèn)值是3。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。
autovacuum_naptime (integer)
設(shè)置自動(dòng)垃圾收集控制進(jìn)程的睡眠時(shí)間。單位是秒,默認(rèn)值是60。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。
autovacuum_vacuum_threshold (integer)
設(shè)置觸發(fā)垃圾收集操作的閾值。默認(rèn)值是50。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。只有一個(gè)表上被刪除或更新的記錄的數(shù)目超過了autovacuum_vacuum_threshold的值,才會(huì)對(duì)這個(gè)表執(zhí)行垃圾收集操作。
autovacuum_analyze_threshold (integer)
設(shè)置觸發(fā)ANALYZE操作的閾值。默認(rèn)值是50。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。只有一個(gè)表上被刪除、插入或更新的記錄的數(shù)目超過了autovacuum_analyze_threshold的值,才會(huì)對(duì)這個(gè)表執(zhí)行ANALYZE操作。
autovacuum_vacuum_scale_factor (floating point)
這個(gè)參數(shù)與何時(shí)對(duì)一個(gè)表進(jìn)行垃圾收集操作相關(guān)。默認(rèn)值是0.2。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。
autovacuum_analyze_scale_factor (floating point)
這個(gè)參數(shù)與何時(shí)對(duì)一個(gè)表進(jìn)行ANALYZE操作相關(guān)。默認(rèn)值是0.1。這個(gè)參數(shù)只能在文件postgresql.conf中被設(shè)置。
10.11 鎖管理參數(shù)
deadlock_timeout(integer)
設(shè)置死鎖超時(shí)檢測(cè)時(shí)間。單位是微秒,默認(rèn)值是1000。死鎖檢測(cè)是一個(gè)消耗許多 CPU資源的操作。這個(gè)參數(shù)的值不能太小。在數(shù)據(jù)庫(kù)負(fù)載比較大的情況下,應(yīng)當(dāng)增大這個(gè)參數(shù)的值。
max_locks_per_transaction(integer)
這個(gè)參數(shù)控制每個(gè)事務(wù)能夠得到的平均的對(duì)象鎖的個(gè)數(shù)。默認(rèn)值是64。數(shù)據(jù)庫(kù)在啟動(dòng)以后創(chuàng)建的共享鎖表的最大可以保存max_locks_per_transaction * (max_connections + max_prepared_transactions)個(gè)對(duì)象鎖。單個(gè)事務(wù)可以同時(shí)獲得的對(duì)象鎖的數(shù)目可以超過max_locks_per_transaction的值,只要共享鎖表中還有剩余空間。
10.12 系統(tǒng)預(yù)設(shè)參數(shù)
這些參數(shù)系統(tǒng)啟動(dòng)后會(huì)自動(dòng)設(shè)置,用戶只能查詢它們的值,不能用任何方式修改這些參數(shù)。
block_size (integer)
報(bào)告數(shù)據(jù)庫(kù)文件數(shù)據(jù)塊的大小。
integer_datetimes (boolean)
如果值為on,表示系統(tǒng)內(nèi)部用64位整數(shù)存儲(chǔ)時(shí)間/日期類型的數(shù)據(jù)。如果值是off,表示系統(tǒng)內(nèi)部不是用64位整數(shù)存儲(chǔ)時(shí)間/日期類型的數(shù)據(jù)。
lc_collate (string)
報(bào)告字符排序設(shè)置。
lc_ctype (string)
報(bào)告字符分類設(shè)置。
max_function_args (integer)
報(bào)告函數(shù)參數(shù)的最大個(gè)數(shù)。
max_identifier_length (integer)
報(bào)告標(biāo)識(shí)符的最大長(zhǎng)度。
max_index_keys (integer)
報(bào)告索引的關(guān)鍵字中列的最大數(shù)目。
server_encoding (string)
報(bào)告服務(wù)器的字符編碼名稱。
server_version (string)
報(bào)告服務(wù)器的版本號(hào)。
server_version_num (integer)
報(bào)告服務(wù)器的小版本號(hào)。
data_directory (string)
數(shù)據(jù)文件所在的目錄。
config_file (string)
數(shù)據(jù)庫(kù)參數(shù)配置文件名。
hba_file (string)
數(shù)據(jù)庫(kù)hba文件名。
external_pid_file (string)
數(shù)據(jù)庫(kù)PID文件名。
10.13 其它參數(shù)
default_with_oids (boolean)
該參數(shù)控制CREATE TABLE 和CREATE TABLE AS命令是否給新建的表添加一個(gè)系統(tǒng)列OID。如果它的值是on,CREATE TABLE 和CREATE TABLE AS命令在沒有指定WITH OIDS 和WITHOUT OIDS子句的情況下,新建的表將包含系統(tǒng)列OID,同時(shí)SELECT INTO命令也會(huì)將系統(tǒng)列OID添加到新建的表中去。默認(rèn)值是off。
search_path (string)
設(shè)置模式搜索路徑。它的值由一個(gè)或多個(gè)模式名構(gòu)成,不同的模式名用逗號(hào)隔開。默認(rèn)值是'"$user", public',$user表示與當(dāng)前會(huì)話用戶名同名的模式名,如果這樣的模式不存在,$user將被忽略。
系統(tǒng)表所在的模式pg_catalog,如果出現(xiàn)在search_path中,它會(huì)按指定的順序被搜索。如果它沒有出現(xiàn)在search_path中,則總是排在search_path中指定的所有模式前面被搜索。
當(dāng)前會(huì)話如果存在存放臨時(shí)表的模式,可以使用別名pg_tmp將它列在搜索路徑中,例如,'"$user", public, pg_tmp'。如果存放臨時(shí)表的模式?jīng)]有出現(xiàn)在搜索路徑中,則它會(huì)作為第一個(gè)搜索對(duì)象,排在pg_catalog和search_path中所有模式的前面。注意,系統(tǒng)只會(huì)在存放臨時(shí)表的模式中搜索表、視圖、序列對(duì)象和數(shù)據(jù)類型這樣的數(shù)據(jù)庫(kù)對(duì)象,不會(huì)在里面搜索函數(shù)或運(yùn)算符這樣的數(shù)據(jù)庫(kù)對(duì)象。
default_tablespace (string)
設(shè)置默認(rèn)表空間。默認(rèn)值是空串。
temp_tablespaces (string)
設(shè)置默認(rèn)的存放臨時(shí)對(duì)象的表空間。默認(rèn)值是空串。它的值由一個(gè)或多個(gè)表空間組成,不同的值用逗號(hào)隔開。
check_function_bodies (boolean)
設(shè)置是否驗(yàn)證CREATE FUNCTION.命令中指定的函數(shù)體。默認(rèn)值是on。關(guān)閉這個(gè)選項(xiàng)可以在從dump文件中恢復(fù)函數(shù)定義信息時(shí)避免系統(tǒng)報(bào)錯(cuò),因?yàn)橐粋€(gè)正在恢復(fù)的函數(shù)可能會(huì)引用尚未恢復(fù)的函數(shù)。
default_transaction_isolation (string)
默認(rèn)的事務(wù)隔離級(jí)別。合法的取值是"read uncommitted"、"read committed"、"repeatable read”和"serializable"。 默認(rèn)值是read committed。
default_transaction_read_only (boolean)
設(shè)置每個(gè)新創(chuàng)建的事務(wù)是否是只讀的。默認(rèn)值是off。只讀事務(wù)只能修改臨時(shí)表。詳細(xì)信息參考SQL命令SET TRANSACTION。
session_replication_role (string)
控制與復(fù)制有關(guān)的觸發(fā)器和規(guī)則的行為??赡艿娜≈凳莖rigin、replica和local,默認(rèn)值是origin。
statement_timeout(integer)
設(shè)置語句執(zhí)行的超時(shí)值。如果一個(gè)語句執(zhí)行的時(shí)間超過statement_timeout指定的值,該語句就會(huì)被強(qiáng)行終止。如果它的值為0,則關(guān)閉超時(shí)特性。單位是毫秒,默認(rèn)值是0。最好不要在文件postgresql.conf中設(shè)置這個(gè)參數(shù),因?yàn)樗绊懰械臅?huì)話。
xmlbinary (string)
設(shè)置XML文檔中二進(jìn)制數(shù)據(jù)的編碼類型。它的值可以是base64和hex。默認(rèn)值是base64。、
xmloption (string)
設(shè)置在字符串和XML數(shù)據(jù)之間進(jìn)行類型轉(zhuǎn)換時(shí)使用的XML文檔類型。它的值是DOCUMENT 或者CONTENT,默認(rèn)值是CONTENT。
DateStyle (string)
設(shè)置時(shí)間和日期值的顯示格式。initdb會(huì)將這個(gè)參數(shù)初始化成與lc_time一致的值。
timezone (string)
設(shè)置顯示和解釋時(shí)間類型數(shù)值時(shí)使用的時(shí)區(qū)。
timezone_abbreviations (string)
設(shè)置數(shù)據(jù)庫(kù)接受的時(shí)區(qū)縮寫值。默認(rèn)值是Default,代表一些通用的時(shí)區(qū)縮寫。
extra_float_digits(integer)
控制浮點(diǎn)數(shù)顯示時(shí)的有效的數(shù)值位的最大個(gè)數(shù)。float4類型的數(shù)的顯示精度是6+ extra_float_digits, float8類型的數(shù)的顯示精度是15+ extra_float_digits。有效的取值范圍是-15到2。默認(rèn)值是0。
client_encoding (string)
設(shè)置客戶端的字符編碼類型。默認(rèn)值是數(shù)據(jù)庫(kù)的字符編碼類型。
lc_monetary (string)
設(shè)置貨幣值的顯示格式。它影響to_char之類的函數(shù)的輸出。
lc_numeric (string)
設(shè)置數(shù)值的顯示格式。它影響to_char之類的函數(shù)的輸出。
default_text_search_config (string)
設(shè)定全文檢索的配置信息,默認(rèn)值是pg_catalog.simple。
explain_pretty_print (boolean)
設(shè)置EXPLAIN VERBOSE命令的是否打開idented輸出格式。默認(rèn)值是on。
dynamic_library_path (string)
設(shè)置數(shù)據(jù)查找動(dòng)態(tài)加載的共享庫(kù)文件的路徑。如果CREATE FUNCTION或LOAD命令沒有指定庫(kù)文件所在的路徑,系統(tǒng)將在dynamic_library_path指定的目錄中查找指定的庫(kù)文件。它的值由一個(gè)或多個(gè)操作系統(tǒng)目錄路徑組成,不同的路徑用冒號(hào)隔開。例如,dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir',其中的:$libdir表示PostgreSQL自己內(nèi)置的共享庫(kù)的路徑,使用命令pg_config –pkglibdir可以找到這個(gè)路徑。默認(rèn)值是'$libdir'。如果它的值是空串,自動(dòng)路徑搜索將被關(guān)閉。超級(jí)用戶可以在任何時(shí)候修改這個(gè)參數(shù),推薦在文件postgresql.conf中配置這個(gè)參數(shù)。
gin_fuzzy_search_limit (integer)
設(shè)置GIN索引返回的集合的大小的上限。
backslash_quote
有三種取值,分別是on、off和safe_encoding。on表示可以在字符串中用/'表示但引號(hào)。off表示/只是一個(gè)普通字符,單個(gè)單引號(hào)必須用兩個(gè)連續(xù)的單引號(hào)表示。safe_encoding與on的功能基本相同,但它比on更安全,推薦使用safe_encoding。默認(rèn)值是safe_encoding。這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。
regex_flavor(string)
設(shè)置系統(tǒng)接受的正則表達(dá)式的類型。取值可以是advanced、extended和basic。默認(rèn)值是advanced。這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。
standard_conforming_strings (boolean)
如果是on,系統(tǒng)會(huì)將sql命令中的字符串中的字符“/”作為普通的字符看待,而不是作為轉(zhuǎn)義字符看待。如果是off,系統(tǒng)會(huì)將sql命令中的字符“/”作為轉(zhuǎn)義字符看待。默認(rèn)值是off。這個(gè)參數(shù)可以在任何時(shí)候被設(shè)置。
synchronize_seqscans (boolean)
如果這個(gè)參數(shù)的值是是on,多個(gè)查詢?nèi)绻瑫r(shí)順序掃描一個(gè)表中的同一個(gè)數(shù)據(jù)頁,系統(tǒng)只會(huì)發(fā)出一個(gè)IO操作來讀取這個(gè)數(shù)據(jù)頁,讀出來的數(shù)據(jù)被多個(gè)查詢共享,減少不必要的 IO操作,提高系統(tǒng)執(zhí)行的效率,但是不帶 ORDER BY子句的查詢產(chǎn)生的結(jié)果中數(shù)據(jù)行的順序可能會(huì)發(fā)生改變。如果值為off,這個(gè)特性將被關(guān)閉。默認(rèn)值是on。
新聞熱點(diǎn)
疑難解答
圖片精選