<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 17.3\. 啟動數據庫服務器 在任何人可以訪問數據庫前,你必須啟動數據庫服務器。數據庫服務器程序名叫`postgres`, 它必須知道在哪里能找到它要用的數據。 這是利用`-D`選項實現的。因此,啟動服務器最簡單的方法是像下面這樣: ``` $ <kbd class="literal">postgres -D /usr/local/pgsql/data</kbd> ``` 這樣將把服務器放在前臺運行。這個步驟同樣必須以PostgreSQL用戶帳戶登錄來做。 沒有`-D`選項,服務器將使用環境變量`PGDATA`命名的目錄; 如果這個環境變量也沒有,將導致失敗。 通常,最好在后臺啟動`postgres`,使用下面的 Unix shell 語法: ``` $ <kbd class="literal">postgres -D /usr/local/pgsql/data >logfile 2>&1 &</kbd> ``` 把服務器的stdout和stderr放到某個地方是非常重要的, 就像在上面建議的這樣。這樣做既可以幫助審計又可以幫助診斷問題。 參閱[Section 23.3](#calibre_link-1275)獲取有關日志文件處理的更完整討論。 `postgres`還接受一些其它的一些命令行選項。 更多的信息請參考[postgres](#calibre_link-1033)手冊頁和下面的[Chapter 18](#calibre_link-500)。 這些 shell 語法很容易讓人覺得無聊。因此我們提供了封裝程序 [pg_ctl](#calibre_link-544)以簡化一些任務。比如: ``` pg_ctl start -l logfile ``` 將在后臺啟動服務器并且把輸出放到指定的日志文件中。`-D` 選項和你直接運行`postgres`時的意思是一樣的。`pg_ctl` 還可以用于關閉服務器。 通常,你會希望在計算機啟動的時候啟動數據庫服務器。 自動啟動腳本是與操作系統相關的。PostgreSQL自己帶了幾個, 放在`contrib/start-scripts`目錄里。需要 root 權限安裝它們。 不同的系統在引導時有不同的啟動守護進程的方法,所以我們建議你先熟悉它。 許多系統有名字稱為`/etc/rc.local`或`/etc/rc.d/rc.local` 這樣的文件,其它的還有`rc.d`目錄。不管你怎么做,都要記住服務器必須以 PostgreSQL用戶帳戶,_而不是 root_ 或者任何其它用戶身份運行。因此,你可能總是要用`su postgres -c '...'`這樣的命令。比如: ``` su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog' ``` 下面是一些比較詳細的與操作系統相關的建議。請注意把每個例子里的具體數值替換成合適的安裝路徑和用戶名。 * 對于FreeBSD,看看PostgreSQL 源代碼版本里的`contrib/start-scripts/freebsd`文件。 * 在OpenBSD上,把下面幾行加到`/etc/rc.local`文件里: ``` if [ -x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]; then su -l postgres -c '/usr/local/pgsql/bin/pg_ctl start -s -l /var/postgresql/log -D /usr/local/pgsql/data' echo -n ' postgresql' fi ``` * 在Linux系統里,要么往`/etc/rc.d/rc.local`或 `/etc/rc.local`文件里加上下面幾行: ``` /usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data ``` 要么看看PostgreSQL源代碼樹里的 `contrib/start-scripts/linux`文件。 * 在NetBSD上,你可以根據愛好選擇FreeBSD 或Linux的啟動腳本之一。 * 在Solaris上,創建一個叫`/etc/init.d/postgresql`的文件, 包含下面行: ``` su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -D /usr/local/pgsql/data" ``` 然后在`/etc/rc3.d`里創建一個指向它的符號鏈接,名字叫`S99postgresql`。 運行的時候,它的PID是保存在數據目錄下的`postmaster.pid` 文件里的。這樣做是為了避免多個服務器在同一個數據目錄內運行,此文件同樣可以用于關閉服務器。 ## 17.3.1\. 服務器啟動失敗 有幾個非常常見的原因會導致服務器啟動失敗。通過檢查服務器日志或者使用手工啟動的方法 (不做 stdout 和 stderr 的重定向),就可以看到錯誤信息。下面我們更詳細地解釋了其中一些錯誤信息。 ``` LOG: could not bind IPv4 socket: Address already in use HINT: Is another postmaster already running on port 5432? If not, wait a few seconds and retry. FATAL: could not create TCP/IP listen socket ``` 就像它提示的那樣:你試圖在已經有一個服務器運行著的端口上再運行了一個服務器。不過, 如果內核的錯誤信息不是 &lt;samp class="literal"&gt;Address already in use&lt;/samp&gt; 或者是其它的變種, 那就有可能是別的毛病。比如,試圖在一個保留的端口上運行服務器會收到下面這樣的信息: ``` $ <kbd class="literal">postgres -p 666</kbd> LOG: could not bind IPv4 socket: Permission denied HINT: Is another postmaster already running on port 666? If not, wait a few seconds and retry. FATAL: could not create TCP/IP listen socket ``` 像這樣的信息: ``` FATAL: could not create shared memory segment: Invalid argument DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600). ``` 可能意味著內核對共享內存區的限制小于PostgreSQL試圖分配的緩沖區大小 (本例中是 4011376640 字節)。或者可能意味著你根本就沒有配置 System-V 風格的共享內存支持。 作為一個臨時的解決辦法,你可以試著以小于正常數量的緩沖區數([shared_buffers](#calibre_link-1370)) 啟動服務器。你最終還是會希望重新配置內核,以增加共享內存的尺寸。 如果你試圖在同一臺機器上啟動多個服務器,而且它們所需的總空間超過了內核的限制,也會報這個錯。 像下面這樣的錯誤: ``` FATAL: could not create semaphores: No space left on device DETAIL: Failed system call was semget(5440126, 17, 03600). ``` _并不_意味著著你已經用光磁盤空間了。它的意思是內核的 System V信號燈的限制小于PostgreSQL想創建的數量。 和上面一樣,你可以通過減少允許的連接數([max_connections](#calibre_link-441))來繞開, 但最終你還是會希望修改內核的限制。 如果你收到一個"illegal system call"錯誤,那么很有可能是內核根本不支持共享內存或者信號燈。 如果是這樣的話,你唯一的選擇就是重新配置內核并且把這些特性打開。 關于配置系統System V IPC資源的細節見[Section 17.4.1](#calibre_link-1338)。 ## 17.3.2\. 客戶端連接問題 盡管可能在客戶端出現的錯誤條件范圍寬廣,而且還和應用相關,但的確有幾種錯誤與服務器的啟動方式直接相關。 除了下面提到的幾種錯誤以外的問題都應該在相應的客戶端應用的文檔中。 ``` psql: could not connect to server: Connection refused Is the server running on host "server.joe.com" and accepting TCP/IP connections on port 5432? ``` 這是純粹的"我找不到可以交談的服務器"錯誤。當試圖進行 TCP/IP 通訊時它看起來像上面的樣子。 常見的錯誤是忘記把服務器配置成允許 TCP/IP 連接。 另外,當試圖通過一個 Unix 套接字與本機服務器通訊時,你會看到這個: ``` psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? ``` 最后一行可以有效地驗證客戶端進行連接嘗試時是否連對了位置。如果實際上沒有服務器在那里運行, 典型的內核錯誤是像上面顯示的那樣或者是&lt;samp class="literal"&gt;Connection refused&lt;/samp&gt;或 &lt;samp class="literal"&gt;No such file or directory&lt;/samp&gt;。尤其要注意的是這種環境下 &lt;samp class="literal"&gt;Connection refused&lt;/samp&gt;的信息顯示_并不_ 意味著服務器收到連接然后拒絕了連接。那樣的話會產生一個不同的信息(像 [Section 19.4](#calibre_link-1260)里面顯示的那樣)。其它像 &lt;samp class="literal"&gt;Connection timed out&lt;/samp&gt;這樣的信息表示更基本的問題,比如缺少網絡連接等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看