簡體   English   中英

MySQL存儲過程在PHP PDO的只讀副本上

[英]MySQL stored procedure on a read replica with PHP PDO

我已經打開了針對MySQL的錯誤報告http://bugs.mysql.com/bug.php?id=70793&thanks=4 這里有一個代碼示例,用於演示此錯誤。 我發現還有一個解決方法,它包含在錯誤報告中。 此解決方法適用於PHP和控制台

我在使用存儲過程和PHP PDO時遇到了一個奇怪的問題。

我不允許發布存儲過程的主體,但我可以提供以下信息。

  • 具有PHP PDO共享的用戶的控制台訪問時 在只讀副本上正常工作 - 編輯:我的初始報告部分不正確,如果臨時表存在則存儲過程將起作用,如果臨時表不存在則存儲過程將失敗在控制台和pdo環境中都存在。 有關詳細信息,請參閱MySQL的鏈接錯誤報告。
  • 我已經確認我在兩個地方都使用相同的用戶。
  • 它執行的唯一寫入活動是在臨時表中
  • 它確實利用了一個游標
  • 主服務器和副本服務器都運行MySQL 5.5.27
  • MySQL服務器在AWS RDS上管理; 我有一個標准配置的參數組。

我的問題是我無法從PHP PDO調用此存儲過程,我收到此錯誤

SQLSTATE [HY000]:常規錯誤:1290 MySQL服務器使用--read-only選項運行,因此無法執行此語句

這完全沒有意義,因為只要我不是用PHP做的話, 我就可以在只讀副本上調用它。

任何人都可以對這里可能發生的事情有所了解嗎?

編輯更多奇怪的信息

我可以讓控制台會話失敗,但我也能讓它成功。 這取決於是否已創建存儲過程使用的臨時表。 因此,讓我解釋一下我的工作和失敗的用例

失敗

  1. 在控制台上登錄服務器
  2. 嘗試調用存儲過程
  3. 失敗The MySQL server is running with the --read-only option so it cannot execute this statement

通過

  1. 在控制台上登錄服務器
  2. 創建臨時表
  3. 嘗試調用存儲過程
  4. 成功

更奇怪的是,我絕對會將該臨時表放在存儲過程中並重新創建它(如果存在的話)。

我相當肯定在這一點上我們正在研究一個MySQL錯誤

您是否嘗試將TEMPORARY關鍵字添加到DROP TABLE命令

TEMPORARY關鍵字具有以下效果:

  • 該語句僅刪除TEMPORARY表。
  • 該聲明並未結束正在進行的交易。
  • 沒有檢查訪問權限。 (TEMPORARY表僅對創建它的會話可見,因此不需要進行檢查。)

--read-only僅適用於非root用戶或非副本用戶。 因此,來自控制台的ROOT仍然可以做任何事情,但不能做PHP用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM