Mysql使用mysqldump按時間導出時的一個注意事項

在使用Mysql的mysqldump命令按時間進行數據導出時,咱們可能會遇到導出數據與原庫中不符或者導出數據和咱們指望的數據不一樣的狀況。mysql

咱們知道Mysql數據庫導出可使用命令mysqldump,使用方式能夠經過在終端中輸入mysqldump --help來查看。
簡單的使用方式以下:
1. 導出整個數據庫(包括數據庫中的數據)
mysqldump -u username -p dbname > dbname.sql sql

2. 導出數據庫結構(不含數據)
mysqldump -u username -p -d dbname > dbname.sql 數據庫

3. 導出數據庫中的某張數據表(包含數據)
mysqldump -u username -p dbname tablename > tablename.sql oop

4. 導出數據庫中的某張數據表的表結構(不含數據)
mysqldump -u username -p -d dbname tablename > tablename.sql spa

咱們能夠用-w(或-where)指定備份條件。在使用過程當中遇到一個問題,按時間導出時,導出的數據時「丟失」了一部分數據,而且時間與庫中的不一樣。code

例如咱們有下面這個表:blog

CREATE TABLE `test_timestamp` (
`pk` int(20) unsigned NOT NULL AUTO_INCREMENT,
`record_time` timestamp NULL DEFAULT NULL COMMENT '記錄日期',
PRIMARY KEY (`pk`),
KEY `time` (`record_time`)
) ENGINE=MyISAM AUTO_INCREMENT=564374307 DEFAULT CHARSET=utf8;

INSERT INTO `test_timestamp` VALUES (1,'2016-08-04 16:00:00'),(2,'2016-08-04 20:00:00'),(3,'2016-08-05 00:00:00'),(4,'2016-08-05 04:00:00');

其中record_time爲timestamp類型,在數據庫中查詢爲:ip

mysql> SELECT * FROM iptv.test_timestamp;
+----+-----------------------------+
| pk | record_time |
+----+-----------------------------+
| 1 | 2016-08-05 00:00:00 |
| 2 | 2016-08-05 04:00:00 |
| 3 | 2016-08-05 08:00:00 |
| 4 | 2016-08-05 12:00:00 |
+----+-----------------------------+

 

咱們將時間大於等於2016-08-05 00:00:00的數據導出:hadoop

mysqldump -u root -p iptv test_timestamp -w"record_time >= '2016-08-05 00:00:00' " > /home/test.sql

 

而後將其導入到原來的庫中後再查詢:table

mysql> SELECT * FROM iptv.test_timestamp;
+----+-----------------------------+
| pk | record_time |
+----+-----------------------------+
| 3 | 2016-08-05 08:00:00 |
| 4 | 2016-08-05 12:00:00 |
+----+-----------------------------+
2 rows in set (0.00 sec)

 

發現只有兩條數據。此時,若是咱們查看導出的test.sql文件,發現裏面只有兩條記錄:
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00')

這與之前庫中的記錄相差8個小時。

緣由就是在導出時,若是沒有加其餘選項,在咱們的導出文件中有這樣幾行:
….
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
….
也就是說,在導出時,首先會將時區time_zone設置爲'+00:00',而time_zone這個值在數據庫中默認是什麼呢:

mysql> show variables like '%time_zone%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+--------------------------+------------+
2 rows in set (0.00 sec)

 

是系統默認時區,查看系統默認時區:

[root@hadoop-data-1 /]# date -R
Thu, 25 Aug 2016 16:25:06 +0800

 

全部咱們的在導出數據時,時間會先作轉換,而後再進行查詢,轉換後的記錄爲:
(1,'2016-08-04 16:00:00'),
(2,'2016-08-04 20:00:00'),
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00');

按照 -w"record_time >= '2016-08-05 00:00:00' "過濾後只剩下:
(3,'2016-08-05 00:00:00'),
(4,'2016-08-05 04:00:00');

因此插入後只剩下兩條數據了。

咱們在按時間導出數據時須要注意這個問題。解決的方式一種是在-w參數中將時間本身進行轉換,另一種方式是先將須要導出的庫的時區進行設置
set time_zone='+00:00';
導出結束後再恢復:
set time_zone='SYSTEM';

同時,若是導出和導入的庫所使用 的時區不一樣,那麼導入的只是時間顯示就不同,若是把兩個庫時區設置爲同樣,數值顯示就相同了。全部當一樣的數據在不一樣數據庫中顯示不一樣時,須要先確認一下時區的問題。

相關文章
相關標籤/搜索