備份mysql
MySQL服務實例運行期間,意外的停電,硬盤損壞,還有一些誤操做、服務器宕機等狀況。這個時候如何確保數據庫可以最大程度地恢復到'正確'的狀態呢?sql
對於數據庫管理人員來講,防止數據丟失最簡單的方法就是:對原始數據按期進行備份,建立數據副本。但數據與預期發生不一致狀況,而後使用備份的數據恢復數據。對於MySQL來講,建立數據副本的經常使用方法有三種數據庫
建立數據副本的方法 服務器
一、數據備份:ide
由MySQL日誌系統前一篇博客咱們知道數據庫的所有數據都以文件的形式,存儲在硬盤上,那咱們就能夠直接備份MySQL的全部數據目錄下的文件就可以達到目的。所以在開啓MySQL服務的時候要設計好各類數據文件以及日誌文件的存放位置,以方便可以快速備份。另外備份的時候最好可以備份到其餘的機器上。工具
二、使用二進制日誌:spa
上面的【數據備份方法】屬於物理備份,粒度較粗,不能實現更細粒度的數據恢復,特別是對於更新較爲頻繁的系統。二進制日誌記錄了數據庫全部的更新操做,數據丟失時,能夠經過徹底備份進行二進制日誌的重作,能夠完成基於時間點或者操做點的恢復,繼而實現數據庫更細粒度的恢復。設計
三、數據庫複製:日誌
數據庫的複製其實是經過二進制日誌預防數據丟失的,數據複製能夠實現數據庫的異地備份和恢復。索引
邏輯備份與物理備份
按照備份後產生的副本文件是否能夠編輯,能夠將MySQL的備份方法分爲邏輯備份和物理備份
一、邏輯備份:
使用邏輯備份是,數據庫管理員一般能夠直接查看和編輯副本文件中的內容。邏輯備份中產生的副本一般喲兩種狀況。情形一:副本是SQL文件,該SQL文件中有crete table 和大量的inert 語句。情形2、副本是指定分隔符的文件,導入數據庫的時候再以指定分隔符切割數據導入便可。
二、物理備份:
物理備份產生的數據副本都是二進制文件,經常不可編輯,例如數據庫的二進制日誌。
冷備份、溫備份、熱備份
數據備份期間,按照是否須要中止MySQL服務實例,能夠將MySQL的數據恢復分爲:冷備份、溫備份、熱備份。
一、冷備份:
冷備份是指中止MySQL服務的運行後在進行數據備份,這種備份方法很是簡單,可是在服務繁忙的系統中,並不容許這樣作。
二、溫備份: 溫備份介於熱備份與冷備份之間,溫備份容許MySQL服務實例繼續運行,備份數據期間,溫備份藉助讀鎖機制保證備份期間,沒有新的數據寫入。
徹底備份、增量備份
按照副本文件的缺失程度能夠將數據備份分爲徹底備份以及增量備份。
一、徹底備份:
徹底備份是一個完整的數據備份,僅僅依靠該副本文件就能夠將數據庫恢復到某個正確的狀態。若是不借助熱備份工具,徹底備份可能須要中止MySQL服務。此時MySQL將沒法提供服務,在真實的業務場景中,不多真正使用徹底備份。
二、增量備份:
增量備份是指在徹底備份的基礎上,對更新的數據進行備份,恢復時須要藉助徹底備份產生的副本文件,目前,MySQL尚未提供真正的增量備份工具。數據庫管理人員可使用熱備份工具模擬實現增量備份,也能夠經過從新執行二進制日誌中的更新語句模擬實現增量備份。
三、熱備份:
熱備份是指不須要中止MySQL服務實例運行,備份數據的方法。若是數據庫的更新操做較爲頻繁,在數據備份期間,備份過的數據可能早已發生變化,所以熱備份的實現方式較爲複雜。
一、備份命令mysqldump格式
格式:mysqldump -h主機名 -P端口 -u用戶名 -p密碼 –database 數據庫名 > 文件名.sql
首先建立一個數據庫和表
mysql> create database mood; Query OK, 1 row affected (0.00 sec) mysql> use mood Database changed mysql> create table info (id int not null primary key auto_increment,name char(10) not null); Query OK, 0 rows affected (0.03 sec) mysql> insert into info -> (name)values('zhangsan'),('lisi'); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select *from info; +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | +----+----------+ 2 rows in set (0.00 sec)
使用tar命令備份
[root@localhost opt]# tar jvcf /opt/mysql-.tar.xz /usr/local/mysql/data/ [root@localhost opt]# ls allback.sql back1.sql mood.sql mysql-2018-09-02.tar.xz mysql-5.7.17 rh
備份單個MySQL數據庫到opt下。(後面出現的warning是由於我把密碼寫在了-P後面,若是不寫則進行密碼交互)。
[root@localhost ~]# mysqldump -uroot -pabc123 mood > /opt/mood.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
備份服務器上全部數據庫到opt下。
[root@localhost ~]# mysqldump -uroot -pabc123 --all-databases > /opt/allback.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
多個數據庫同時備份(備份了mood和自帶的mysql兩個數據庫)
[root@localhost opt]# mysqldump -uroot -pabc123 --databases mood mysql > /opt/mood-mysql.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
備份數據庫中的表
[root@localhost opt]# mysqldump -uroot -pabc123 mood info > /opt/info.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
備份表結構
[root@localhost opt]# mysqldump -uroot -pabc123 -d mood info > /opt/info1.sql mysqldump: [Warning] Using a password on the command line interface can be insecure.
恢復表數據的兩種辦法
1再數據庫中執行
mysql> use mood Database changed mysql> drop table info; Query OK, 0 rows affected (0.01 sec) mysql> show tables; Empty set (0.01 sec) mysql> source /opt/info.sql; Query OK, 0 rows affected (0.00 sec) mysql> show tables; +----------------+ | Tables_in_mood | +----------------+ | info | +----------------+ 1 row in set (0.00 sec)
2直接倒回表數據
[root@localhost opt]# mysql -uroot -pabc123 mood < /opt/info.sql mysql: [Warning] Using a password on the command line interface can be insecure.
不進入數據庫使用-e直接查看數據表
[root@localhost opt]# mysql -uroot -pabc123 -e 'use mood;show tables;select *from info;' mysql: [Warning] Using a password on the command line interface can be insecure. +----------------+ | Tables_in_mood | +----------------+ | info | +----------------+ +----+----------+ | id | name | +----+----------+ | 1 | zhangsan | | 2 | lisi | +----+----------+
MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。
打個比方,若是合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一我的力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
建立索引時,你須要確保該索引是應用在 SQL 查詢語句的條件(通常做爲 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保存數據,還要保存一下索引文件。
創建索引會佔用磁盤空間的索引文件。
這是最基本的索引,它沒有任何限制。它有如下幾種建立方式:
CREATE INDEX indexName ON mytable(username(length));
若是是CHAR,VARCHAR類型,length能夠小於字段實際長度;若是是BLOB和TEXT類型,必須指定 length。
ALTER table tableName ADD INDEX indexName(columnName)
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
DROP INDEX [indexName] ON mytable;
它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。它有如下幾種建立方式:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
ALTER table mytable ADD UNIQUE [indexName] (username(length))
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
有四種方式來添加數據表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味着索引值必須是惟一的,且不能爲NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句建立索引的值必須是惟一的(除了NULL外,NULL可能會出現屢次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現屢次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引爲 FULLTEXT ,用於全文索引。
如下實例爲在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還能夠在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試如下實例刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
主鍵只能做用於一個列上,添加主鍵索引時,你須要確保該主鍵默認不爲空(NOT NULL)。實例以下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除主鍵時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
你可使用 SHOW INDEX 命令來列出表中的相關的索引信息。能夠經過添加 \G 來格式化輸出信息。
嘗試如下實例:
mysql> SHOW INDEX FROM table_name; \G ........