首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL SYSDATE() 與 NOW() 關鍵差異與主從同步風險

     編輯:MySQL 綜合教學

五個時間函數對比

函數回傳格式範例
NOW()YYYY-MM-DD HH:MM:SS2012-09-23 06:48:28
CURDATE()YYYY-MM-DD2012-09-23
CURTIME()HH:MM:SS06:48:28
UNIX_TIMESTAMP()整數時間戳1348408108
SYSDATE()YYYY-MM-DD HH:MM:SS2012-09-23 06:48:28

核心差異:執行時間基準點

  • NOW()、CURDATE()、CURTIME()、UNIX_TIMESTAMP():回傳語句開始執行時的時間
  • SYSDATE():回傳函數實際執行當下的即時時間

實測對比

NOW():同一語句內多次呼叫回傳相同值


mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW()               | SLEEP(2) | NOW()               |
+---------------------+----------+---------------------+
| 2012-09-23 06:54:29 | 0        | 2012-09-23 06:54:29 |
+---------------------+----------+---------------------+
1 row in set (2.00 sec)

SYSDATE():同一語句內多次呼叫回傳不同時值


mysql> SELECT SYSDATE(), SLEEP(2), SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE()           | SLEEP(2) | SYSDATE()           |
+---------------------+----------+---------------------+
| 2012-09-23 06:55:00 | 0        | 2012-09-23 06:55:02 |
+---------------------+----------+---------------------+
1 row in set (2.01 sec)

主從同步風險警示

使用 SYSDATE() 會導致主從資料不一致!

  • Master 執行時取得時間 T1
  • Binlog 記錄 SYSDATE() 呼叫
  • Slave 重放時取得時間 T2(T2 ≠ T1)
  • 導致同樣 SQL 在主從產生不同結果

最佳實踐

  • 一般查詢、業務邏輯一律使用 NOW()
  • 僅在極特殊需求(如高精度審計日誌)考慮 SYSDATE()
  • MySQL 5.6+ 可啟動 --sysdate-is-now 參數強制 SYSDATE() 等同 NOW()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved