本文部分內容參考來了以下文章:
https://blog.csdn.net/helloxiaozhe/article/details/77680255
http://c.biancheng.net/view/1092.html
感謝這兩位博主的分享
今天主要來整理下關於MySQL的安全備份問題。
最近遇到一個任務,需要對一臺服務器上邊的數據進行安全備份,爲此我特地整理了常見的安全備份方案。
按照常見的備份手段,數據備份可以劃分爲熱備份,冷備份,溫備份。
下邊我簡單講解下這幾種備份的不同:
熱備份:直接對運行中的數據做安全導出備份,但是沒有做任何額外安全處理,有可能導出的數據具有部分不完整性。
冷備份:這種備份手段就是直接拷貝數據庫的物理文件。注意不同版本的mysql數據文件格式可能不同。
溫備份:直接對運行中的數據做安全導出備份,期間需要加一把讀鎖防止其餘正在訪問的線程影響當前備份數據的完整性。
從備份的數據角度來看,備份數據的格式又分爲邏輯備份和裸文件備份,其實就是對應了sql信息和mysql的原始物理文件。
前者簡單易懂,但是備份時間較長,後者的實現原理更爲複雜,但是功能更爲強大。
冷備份的優點:
簡單好用,不需要額外導出sql,也不需要重新建立索引等數據。
冷備份的缺點:
由於原始文件裏存儲量相關的undo段,插入緩衝等信息,所以往往這類文件的體積都會比較大。
mysqldump的實戰:
場景1,對單個數據庫對指定某張表做熱備份。
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]# mysqldump -uroot -p test-db02 user_money > backup_user_money.sql
Enter password:
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]# ls
backup_user_money.sql
這種方式的備份主要是包含了建表的sql和一些數據插入的sql信息。
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]# cat ./backup_user_money.sql
-- MySQL dump 10.13 Distrib 5.7.24, for Linux (x86_64)
--
-- Host: localhost Database: test-db02
-- ------------------------------------------------------
-- Server version 5.7.24
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `user_money`
--
DROP TABLE IF EXISTS `user_money`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user_money` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`money` double(6,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `user_money`
--
LOCK TABLES `user_money` WRITE;
/*!40000 ALTER TABLE `user_money` DISABLE KEYS */;
INSERT INTO `user_money` VALUES (1,'idea',995);
/*!40000 ALTER TABLE `user_money` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2020-04-18 15:53:26
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]#
如果需要備份整個數據庫的信息,那麼可以執行下邊這條命令:
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]# mysqldump -uroot -p mall > mall.sql
Enter password:
[root@izwz9ic9ggky8kub9x1ptuz mysql-dump]# ls
mall.sql
關於導入導出的sql主要規律如上,剩下的都是參數指令的用法: 備份導出示例: 1、導出數據和表結構——將特定數據庫特定表中的數據和表格結構和數據全部返回 ```sql mysqldump --u b_user -h 101.3.20.33 -p'H_password' -P3306 database_di up_subjects > 0101_0630_up_subjects.sql ``` 2、導出表結構卻不導出表數據——只返回特定數據庫特定表格的表格結構,不返回數據,添加“-d”命令參數
mysqldump --u b_user -h 101.3.20.33 -p'H_password' -P3306 -d database_di up_subjects > 0101_0630_up_subjects.sql
3、導出表結構和滿足挑頂條件的表數據——只返回特定數據庫中特定表的表格結構和滿足特定條件的數據
mysqldump --u b_user -h 101.3.20.33 -p'H_password' -P3306 database_di up_subjects --where=" ctime>'2017-01-01' and ctime<'2017-06-30'" > 0101_0630_up_subjects.sql
4、導出數據卻不導出表結構——只返回特定數據庫中特定表格的數據,不返回表格結構,添加“-t”命令參數
mysqldump --u b_user -h 101.3.20.33 -p'H_password' -t -P3306 database_di up_subjects >0101_0630_up_subjects.sql
5、導出特定數據庫的所有表格的表結構及其數據,添加“–databases ”命令參數
mysqldump --u b_user -h 101.3.20.33 -p'H_password' -P3306 --databases test > all_database.sql
同理,如果需要導入數據的話,可以使用下邊這命令: 格式:mysql -h鏈接ip -P(大寫)端口 -u用戶名 -p密碼 數據庫名 < d:XX.sql(路勁) ```sql mysql -uusername -ppassword db1
更多詳細信息可以參考這篇文章內容:https://blog.csdn.net/helloxiaozhe/article/details/77680255
編寫定時任務crontab的腳本
關於定時任務腳本的編寫這裏使用的是linux自帶的crond提供的功能來實現。
這裏我先介紹下什麼是crond
crond是linux系統內部自帶的一個用於週期性執行定時任務的守護線程。
如何設置crond線程的啓動和關閉
[root@localhost ~]# service crond restart
停止 crond: [確定]
正在啓動 crond: [確定]
#重新啓動crond服務
[root@localhost ~]# chkconfig crond on
#設定crond服務爲開機自啓動
其實crontab的編寫並不複雜,只需要輸入crontab -e指令,然後便會有個類似vi的編輯文本框開啓供程序員輸入相關的定時腳本。
[root@localhost !]# crontab -e
#進入 crontab 編輯界面。會打開Vim編輯你的任務
* * * * * 執行的任務
這裏的五個*參數的含義分別如下所示:
第一個"*" 一小時當中的第幾分鐘(minute) 0~59
第二個"*" 一天當中的第幾小時(hour) 0~23
第三個"*" 一個月當中的第幾天(day) 1~31
第四個"*" 一年當中的第幾個月(month) 1~12
第五個"*" 一週當中的星期幾(week) 0~7(0和7都代表星期日)
關於crontab的更多相關信息可以參考這篇文章:http://c.biancheng.net/view/1092.html
下邊是我寫的一個每天凌晨進行sql備份的腳本內容:
首先是crontab的內容,非常簡答的一段命令,並且將定時任務輸出到了日誌裏面
30 21 * * * /data/mysql-dump/script/backupShell.sh >> /data/mysql-dump/script/backup.log
最後是備份的腳本內容:
echo "$(date) now is begin to backup"
backup_dir="/data/mysql_dump"
time=$(date +%Y%m%d)
mysqldump -uroot -p'數據庫密碼' idea-blog > idea-blog-$time.sql
echo $backup_dir/idea-blog-$time.sql
通過這種方式來進行數據庫備份。
當然由於筆者只有一臺服務器做測試,所以單純只是備份在了本機上,這樣的做法有一定的單點故障風險,所以其實並不是特別推薦,如果有條件的話,可以做成多機備份的方式。目前市面上也有很多成熟的備份方案,不僅僅只限於邏輯數據文件的備份,還有原始文件的備份。這裏我列舉幾項常見的方案:
方案一:mysqldump+binlog: ( 推薦)
完全備份,通過備份二進制日誌實現增量備份
方案二: xtrabackup:
對InnoDB:熱備,支持完全備份和增量備份
對MyISAM:溫備,只支持完全備份
方案三: lvm2快照+binlog:
幾乎熱備,物理備份