您好,登錄后才能下訂單哦!
備份
MySQL服務實例運行期間,意外的停電,硬盤損壞,還有一些誤操作、服務器宕機等情況。這個時候如何確保數據庫能夠最大程度地恢復到'正確'的狀態呢?
對于數據庫管理人員來說,防止數據丟失最簡單的方法就是:對原始數據定期進行備份,創建數據副本。但數據與預期發生不一致情況,然后使用備份的數據恢復數據。對于MySQL來說,創建數據副本的常用方法有三種
創建數據副本的方法
1、數據備份:
由MySQL日志系統前一篇博客我們知道數據庫的全部數據都以文件的形式,存儲在硬盤上,那我們就可以直接備份MySQL的所有數據目錄下的文件就能夠達到目的。因此在開啟MySQL服務的時候要設計好各種數據文件以及日志文件的存放位置,以方便能夠快速備份。另外備份的時候最好能夠備份到其他的機器上。
2、使用二進制日志:
上面的【數據備份方法】屬于物理備份,粒度較粗,不能實現更細粒度的數據恢復,特別是對于更新較為頻繁的系統。二進制日志記錄了數據庫所有的更新操作,數據丟失時,可以通過完全備份進行二進制日志的重做,可以完成基于時間點或者操作點的恢復,繼而實現數據庫更細粒度的恢復。
3、數據庫復制:
數據庫的復制實際上是通過二進制日志預防數據丟失的,數據復制可以實現數據庫的異地備份和恢復。
邏輯備份與物理備份
按照備份后產生的副本文件是否可以編輯,可以將MySQL的備份方法分為邏輯備份和物理備份
1、邏輯備份:
使用邏輯備份是,數據庫管理員通常可以直接查看和編輯副本文件中的內容。邏輯備份中產生的副本通常喲兩種情況。情形一:副本是SQL文件,該SQL文件中有crete table 和大量的inert 語句。情形二、副本是指定分隔符的文件,導入數據庫的時候再以指定分隔符切割數據導入即可。
2、物理備份:
物理備份產生的數據副本都是二進制文件,常常不可編輯,例如數據庫的二進制日志。
冷備份、溫備份、熱備份
數據備份期間,按照是否需要停止MySQL服務實例,可以將MySQL的數據恢復分為:冷備份、溫備份、熱備份。
1、冷備份:
冷備份是指停止MySQL服務的運行后在進行數據備份,這種備份方法非常簡單,但是在服務繁忙的系統中,并不允許這樣做。
2、溫備份: 溫備份介于熱備份與冷備份之間,溫備份允許MySQL服務實例繼續運行,備份數據期間,溫備份借助讀鎖機制保證備份期間,沒有新的數據寫入。
完全備份、增量備份
按照副本文件的缺失程度可以將數據備份分為完全備份以及增量備份。
1、完全備份:
完全備份是一個完整的數據備份,僅僅依靠該副本文件就可以將數據庫恢復到某個正確的狀態。如果不借助熱備份工具,完全備份可能需要停止MySQL服務。此時MySQL將無法提供服務,在真實的業務場景中,很少真正使用完全備份。
2、增量備份:
增量備份是指在完全備份的基礎上,對更新的數據進行備份,恢復時需要借助完全備份產生的副本文件,目前,MySQL還沒有提供真正的增量備份工具。數據庫管理人員可以使用熱備份工具模擬實現增量備份,也可以通過重新執行二進制日志中的更新語句模擬實現增量備份。
3、熱備份:
熱備份是指不需要停止MySQL服務實例運行,備份數據的方法。如果數據庫的更新操作較為頻繁,在數據備份期間,備份過的數據可能早已發生變化,因此熱備份的實現方式較為復雜。
1、備份命令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 ........
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。