當前位置:成語大全網 - 書法字典 - 兩臺機器之間的MySQL連接問題

兩臺機器之間的MySQL連接問題

當表丟失或損壞時,備份數據庫是很重要的。如果系統崩潰,您可以將表恢復到崩潰時的狀態,同時盡可能減少數據丟失。同樣,錯誤發送DROP DATABASE或DROP TABLE命令的用戶可能會要求您進行數據恢復。有時,這是由MySQL管理員造成的,他試圖通過用vi或emacs之類的編輯器直接編輯表文件來破壞它們。手表這樣做肯定不好。

備份數據庫的兩種主要方法是使用mysqldump程序或直接復制數據庫文件(如使用c p、tar或c p i o)。每種方法都有自己的優點和缺點:

Mysqldump與MySQL服務器協同工作。直接復制方法與服務器是分開的,因此必須采取措施來確保在復制時沒有客戶端修改這些表。這個問題和使用文件系統備份來備份數據庫是壹樣的:如果在文件系統備份的時候更新了數據庫表,那麽備份的表文件就處於不壹致的狀態,以後恢復表就沒有意義了。文件系統備份和直接文件復制的區別在於,對於後者,妳有權利控制備份進度,所以妳可以采取措施保證服務器保持表處於靜態。

Mysqldump比直接復制技術慢。

Mysqldump生成的文本文件可以移植到其他機器上,甚至是不同硬件結構的機器上。直接復制文件不能移植到其他機器上,除非要復制的表使用MyISAM存儲格式。ISAM表只能在具有相同硬件結構的機器之間復制。例如,將文件從PARC的Solaris機器復制到英特爾的Solaris機器(反之亦然)是不可行的。MySQL3.23推出的MyISAM表存儲格式可以解決這個問題,因為它是機器無關的。因此,如果滿足以下兩個條件,直接復制文件就可以移植到不同硬件結構的機器上:即另壹臺機器也必須運行MySQL3.23版或以上,並且文件必須表示為MyISAM表而不是ISAM表。

無論選擇哪種備份方法,都必須遵循某些原則,以確保在需要還原數據庫內容時獲得最佳結果:

定期執行備份。制定壹個時間表,並堅持下去。

告訴服務器運行更新日誌。當您需要恢復崩潰的數據庫時,更新日誌會有所幫助。使用備份文件將數據庫還原到備份時的狀態後,可以通過在更新日誌中運行查詢來重新運行備份後所做的更改。該操作將數據庫中的表還原到崩潰時的狀態。在文件系統備份語言中,數據庫備份文件表示完全轉儲,而更新日誌表示增量轉儲。

為備份文件使用壹致且易於理解的命名模式。像b a c k up 1和backup2這樣的名字沒有什麽特別的含義。當您需要它來執行恢復時,您必須浪費時間查看文件的內容。您會發現使用數據庫名稱並花時間構建備份文件名是有益的。例如:

% MySQL dump samp _ db/usr/archives/MySQL/samp _ db。1999-10-02

% MySQL dump menagerie/usr/archives/MySQL/menagerie . 1999-10-02

您可能需要在備份文件生成後對其進行壓縮。畢竟,備份文件很大,所以您可能還需要終止備份文件以防止它們填滿磁盤,這類似於終止日誌文件。您可以使用相同的技術來終止備份文件:

使用文件系統備份來備份您的備份文件。如果妳遭遇完全崩潰,不僅數據目錄,而且包含數據庫備份的磁盤驅動器都會被破壞,這將會造成真正的麻煩。您還應該備份更新日誌。

將備份文件放在與數據庫不同的文件系統上。這將降低包含數據字典的文件系統被生成的備份文件填滿的可能性。

創建備份的技術對於將數據庫復制到另壹臺服務器上也很有幫助。通常將數據庫傳輸到運行在另壹臺主機上的服務器,但是您也可以將數據傳輸到運行在同壹臺主機上的另壹臺服務器。如果您正在為MySQL的新版本運行服務器,並且希望在生產服務器上用壹些真實數據測試它,那麽您可以這樣做。另壹種可能是,您得到了壹臺新機器,並希望將所有數據庫都轉移到這臺新機器上。

用mysqldump備份和復制數據庫

使用mysqldump程序生成數據庫備份文件時,默認設置是文件內容由C R E AT E TABLE語句組成,這些語句創建轉儲表,並在表中插入包含行數據的語句。換句話說,mysqldump創建的輸出可以在將來作為mysql的輸入來重建數據庫。

您可以通過以下命令將整個數據庫轉儲到單獨的文本文件中:

文件的其余部分由更多的INSERT和CREATE TABLE語句組成。如果您想要壓縮備份,可以用類似於下面的命令來替換它:

% MySQL dump samp _ db | gzip/usr/archives/MySQL/samp _ db . 1999.10.02 . gz

如果您有壹個非常大的數據庫,輸出文件也會非常大,很難管理。如果願意,您可以轉儲單個表的內容,方法是用mysqldump命令的數據庫名稱命名它們。該操作將轉儲文件分成更小、更易於管理的文件。以下示例將顯示如何將samp_db的壹些表轉儲到單個文件中:

% mysqldump samp_db學生成績事件缺課gradebook.sql

% mysqldump samp_db成員總裁hist-league.sql

如果您正在生成備份文件並計劃使用它們定期刷新另壹個數據庫的內容,您可能希望使用-add-drop-table選項。該選項告訴mysqldump將DROP TABLE IF EXISTS語句寫入備份文件。然後,當您取出備份文件並將其加載到第二個數據庫中時,如果該表已經存在,將不會出現錯誤消息。如果運行第二個數據庫,可以使用這種技術定期加載第壹個數據庫的數據副本。

如果您正在轉儲數據庫以便將其轉換到另壹臺服務器,則不需要創建備份文件。妳要確保數據庫存在於另壹臺主機上,然後用管道讓mysql直接讀取mysqldump的輸出來轉儲數據庫。例如,如果要將samp_db數據庫從PIT _ V I per.snake.net復制到b o a. s n a k e. n e t,操作如下:

% MySQL admin-h boa . snake . net創建samp_db

% mysqldump樣本數據庫| MySQL-h boa.snake.net樣本數據庫

稍後,如果您想在boa.snake.net中再次刷新數據庫,可以跳過mysqladmin命令,但要在mysqldump中添加-add-drop-table,以避免出現“表已經存在”的錯誤:

% mysqldump - add-drop-table樣本數據庫| MySQL-h boa-snake.net樣本數據庫

mysqldump的其他選項包括:

- flush-log和- lock-tables的組合有助於檢查數據庫。- lock-table鎖定所有被轉儲的表,而- flush-log關閉並重新打開更新日誌文件。如果正在生成後續更新日誌,新的更新日誌將只包含從備份點修改數據庫的查詢。此時,檢查該備份時間的更新日誌的檢查點(但是,如果您有需要執行更新操作的客戶機,則在備份期間鎖定所有表對於客戶機訪問並不好)。

如果使用- flush-logs檢查備份時間的更新日誌檢查點,最好轉儲整個數據庫。如果轉儲單個文件,則很難將更新日誌的檢查點與備份文件同步。在恢復操作中,通常基於per-d數據庫提取更新日誌的內容。沒有提取單個表的更新日誌的選項,所以您必須自己提取它們。

默認情況下,mysqldump在寫入之前將表的全部內容讀入內存。這其實沒必要。事實上,如果妳真的有壹個很大的表,這幾乎是壹個失敗的方法。您可以用- quick選項告訴mysqldump寫下每壹行(只要它被檢索到)。為了進壹步優化轉儲過程,可以使用-OPT來代替-QUICK。opt選項打開其他選項,這將加快數據轉儲和讀回的速度。

由於快速備份的優點,使用- opt執行備份是最常用的方法。但是,請註意-opt選項是有代價的:-opt優化您的備份過程,而不是其他客戶機對數據庫的訪問。opt選項防止任何人更新任何被轉儲的鎖定表。妳會很容易發現,在常規

在數據庫訪問方面所做的努力受到管制。嘗試在壹天中數據庫最忙的時候運行備份。不會花太多時間。

與- opt有些相反的選項是-d e l a y e d這個選項會導致mysqldump編寫壹個INSERT D E L AYED語句,而不是INSERT語句。如果您將壹個數據文件加載到另壹個數據庫中,並希望最小化該操作對其他查詢(可能發生在數據庫中)的影響,那麽- d e l a y e d將有助於實現這壹目標。

- compress選項有助於將數據庫復制到另壹臺機器上,因為它可以減少網絡傳輸中的字節數。下面是壹個例子,請註意,為了使程序與遠程主機上的服務器通信(而不是與本地主機通信),給出了- compress選項:

% MySQL dump-opt samp _ db | MySQL-compress-h boa.snake.net samp _ db

Mysqldump有很多選項,詳情請參考附錄E。

使用直接復制數據庫備份和復制方法

不使用mysqldump備份數據庫或表的另壹種方法是直接復制表文件。這通常可以通過使用c . p、tar或cpio等工具來完成。本節中的示例使用了c。

使用直接復制備份方法時,必須確保不使用這些表。如果服務器在復制表時修改了表,則復制是無效的。

確保復制完整性的最佳方法是關閉服務器,復制文件,然後重新啟動服務器。如果您不想關閉服務器,您應該參考第13章,了解在執行表檢查點時鎖定服務器的說明。如果服務器正在運行,相同的約束也適用於復制文件,您應該使用相同的鎖定協議來保持服務器不動。

假設服務器關閉或者要復制的表被鎖定,下面的示例將顯示如何將整個samp_db數據庫備份到備份目錄(DATADIR代表服務器的數據目錄):

% cd數據目錄

% cp -r samp_db /usr/archive/mysql單表可以復制如下:

% cd數據目錄/樣本數據庫

% cd成員。* /usr/archive/mysql/samp_db

% cd分數。* /usr/archive/mysql/samp_db

...

當備份完成時,您可以重新啟動服務器(如果它已經關閉)或釋放對表施加的鎖(如果您保持服務器運行)。

如果您想使用直接復制文件將數據庫從壹臺機器復制到另壹臺機器,只需將這些文件復制到另壹臺服務器主機上的相應數據庫。確保這些文件用於MyISAM,或者兩臺機器具有相同的硬件結構。否則,這些表在第二臺主機上似乎會有奇怪的內容。您還應該確保在安裝這些表時,第二臺主機上的服務器不會訪問這些表。

復制數據庫

術語“復制”的含義只是有點像“將數據庫復制到另壹個服務器”,或者當主數據庫的內容發生變化時實時更新輔助數據庫的含義。如果您想簡單地將數據庫復制到另壹個服務器,可以使用前面討論的命令。從MySQL3.23版開始,開始出現對基於有效更新的復制的支持。但是它的功能還不成熟,這方面我沒什麽好討論的。有興趣可以關註壹下目前的新版本,看看有什麽新的開發功能。