MySQL學習筆記之十二 數據庫目錄

    MySQL有三種保證數據安全的方法:

    1、常規日誌和更新日誌

    通過保存執行的查詢供你必要時恢復

    2、數據庫備份

    通過導出數據或者表文件的拷貝來保護數據

    3、數據庫複製

    MySQL內部複製功能是建立在兩個或兩個以上服務器之間,通過設定它們之間的主從關係來實現的。其中一個作爲主服務器,其他作爲從服務器。

    以上都是一些概念性的東西,具體如何實現,還得一步一步來學習操作,先講 數據庫目錄。

    一、數據目錄的位置

    缺省的數據庫位置,不同的安裝方式,缺失位置是不同的。

    如果您是在一個源程序分發包中安裝MySQL,典型的缺省位置可能是/usr/local/var;

    如果在二進制分發包中安裝 MySQL,則爲/usr/local/mysql/ data;

    在 RPM 文件中安裝,爲/var/lib/mysql;

    對於windwos平臺上的分發,其位置時BASEDIR\data

    數據目錄的位置可以在啓動服務器時通過--datadir = / path / to / dir 明確地指定。如果你想將數據庫目錄放到其他位置而非缺省的位置,則這個選項是有用的。

    瞭解數據庫目錄的位置,是作爲一名MySQL管理員必須知道的,有以下幾種方式:

    1、可使用mysqladmin變量直接從服務器中得到數據目錄路徑名。(當然需要加上 -u 用戶名 -p 密碼)

    在UNIX中,輸入命令:$mysqladmin variables

    在window中,輸入命令:c:\mysql\bin>mysqladmin variables

    如果正在運行多個服務器,它們將監聽不同的TCP/IP端口號和套接字。可以通過提供合適的--port和--socket選項連接到每個服務器監聽的端口和套接字上:(當然需要加上 -u 用戶名 -p 密碼)

    $mysqladmin –port=port_num variables
    $mysqladmin –socket=/path/to/socket variables

    mysqladmin 命令可在您連接服務器的任何一臺主機上運行。如果需要連接到遠程主機上的服務器,則使用--host = host_name 選項:(當然需要加上 -u 用戶名 -p 密碼)
    $mysqladmin –host=host_name varibles

    2、在UNIX平臺上,可使用ps來查看任何當前執行mysql進程的命令行。

    命令行輸入:$ps au | grep mysqld

   如果系統運行多個服務器(因爲一次發現了多個數據目錄位置),則ps 命令將會特別有用。它的缺點是:ps 必須運行在服務器的主機上,並且除非--datadir 選項在mysqld 命令行中明確指定,否則將產生無用的信息。

    3、如果 MySQL 從源程序分發包中安裝,可以檢查其配置信息以確定數據目錄的位置。例如,在最高級的Makefile中該位置是可用的。但是,要小心:位置是Makefile 中的變量localstatedir 的值,而不是datadir 的值。同樣,如果分發包定位在NFS 裝配文件系統中,並且是用於爲幾個主機建立MySQL的,則配置信息反映最近建立分發包的主機。它可能不顯示您感興趣的主機的數據目錄。

    4、、如果前面的任何方法都不成功,可使用find 搜索數據庫文件。下列命令將搜索.frm(描述)文件,它是MySQL 安裝程序的組成部分:
    $find / -name “*.frm” –print

    二、數據庫表示法

    由MySQL管理的每個數據庫都有自己的數據庫目錄,它們是數據目錄的子目錄,與所表示的數據庫有相同的名稱。例如,數據庫my_db 對應於數據庫目錄DATADIR/my_db。

    這個表示法使得幾個數據庫級的語句的實現是非常容易的。CREATE DATABASE db_name 使用只允許對MySQL 服務器用戶(服務器運行的UNIX 用戶)進行訪問的所有權和方式,並在數據目錄中創建一個空目錄db_name。這等價於以服務器主機中的服務器用戶的身份通過執行下列命令手工創建數據庫:
    $ mkdir DATADIR/db_name 創建數據庫目錄

    $ chmod 700 DATADIR/db_name 使它僅對 MySQL 服務器用戶可訪問
    通過空目錄表示新數據庫的方法與其他數據庫系統完全不同,那些數據庫系統甚至要爲“空”數據庫創建許多控制文件或系統文件。
    DROP DATABASE 語句也很容易實現。DROP DATABASE db_name 刪除數據目錄中的db_name 目錄以及其中的所有表文件。這個語句類似於下列命令:
    $rm -rf DATADIR/db_name
    其區別是,服務器只刪除帶有表的擴展名的文件。如果已經在該數據庫目錄中創建了其他的文件,服務器將使它們保持完整,並且不刪除該目錄本身。
    SHOW DATABASE 只不過是對應位於數據目錄中的子目錄名稱的一個列表。有些數據庫系統需要保留一個列出所有需要維護的數據庫的主表,但是,在MySQL 中沒有這樣的結構。由於數據目錄結構的簡單性,數據庫的列表是隱含在該數據目錄的內容中的,像主表這樣的表可能會引起不必要的開銷。

    三、數據庫表的標識方法

    數據庫中的每個表在數據庫目錄中都作爲三個文件存在:一個格式(描述)文件、一個數據文件和一個索引文件。每個文件的基名是該表名,擴展名指明該文件的類型。擴展名如表5-1所示。數據和索引文件的擴展名指明該表是否使用較老的ISAM 索引或較新的MyISAM 索引。

   

    當發佈定義一個表結構的 CREATE TABLE tbl_name 語句時,服務器創建tbl_name.frm 文件,它包含該結構的內部編碼。該語句還創建空的數據文件和索引文件,這些文件的初始信息表明沒有記錄和索引(如果CREATE TABLE 語句包含索引說明,則該索引文件將反映這些索引)。描述表的文件的所有權和方式被設置爲只允許對MySQL 服務器用戶的訪問。
    當發佈 ALTER TABLE 語句時,服務器對tbl_name.frm 重新編碼並修改數據文件和索引文件的內容以反映由該語句表明的結構變化。對於CREATE 和DROP INDEX 也是如此,因爲服務器認爲它們等價於ALTER TABLE 語句。DROP TABLE 刪除代表該表的三個文件。
    儘管可以通過刪除數據庫目錄中的對應某個表的三個文件來刪除該表,但不能手工創建或更改表。例如,如果my_db 是當前的數據庫,DROP TABLE my_tbl 大致等價於下列命令:
    來自於SHOW TABLES my_db 的輸出結果正是my_db 數據庫目錄中.frm 文件基名的一個列表。某些數據庫系統維護一個列出了數據庫中的所有表的登記。但MySQL 不這樣做,因爲沒有必要,這個“登記”隱含在了數據目錄的結構中。

    四、MySQL狀態文件

    除數據庫目錄外,MySQL數據目錄還包含許多狀態文件。大多數狀態文件的名稱從服務器主機名字中生成,在此表中表示爲HOSTNAME.

   

    服務器在啓動時將它的進程ID(PID)寫入PID文件,並在關閉時刪除該文件。PID 文件是一種方法,用這種方法,其他的進程可以找到該服務器。例如,如果您在系統關閉時運行mysql.server 腳本來關閉MySQL 服務器,則該腳本將檢查PID 文件以確定它需要哪個進程來發送一個終止信號。
    錯誤日誌由 safe_mysqld 產生,作爲服務器標準錯誤輸出結果的重定向,它包含服務器寫入stderr 的所有消息。這意味着僅當通過調用safe_mysqld 啓動服務器時,錯誤日誌才存在(總之,這是啓動服務器的首選方法,因爲,如果由於一個錯誤使錯誤日誌存在,則safe_mysqld將重新啓動服務器)。
常規日誌和更新日誌是可選的,可以用--log 和--log-update 服務器選項開啓需要的日誌類型。
    常規進程提供有關服務器運作的常規信息:誰從哪裏進行了連接,以及他們發佈了什麼查詢。更新日誌也提供查詢信息,但僅僅是修改過的數據庫內容的查詢信息。更新日誌的內容是一些SQL 語句,這些語句可以通過將它們輸入到mysql 客戶機程序來運行。如果出現崩潰且必須轉到備份文件時,更新日誌將是有用的,因爲您能夠通過將更新日誌輸入到服務器來重複這些自崩潰以來所完成的更新操作。這將使得數據庫恢復到崩潰發生時所處的狀態上。

發佈了66 篇原創文章 · 獲贊 3 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章