çµè«ã¨ãã¦ã¯ã§ããªããæ£ç¢ºã«ã¯ã¬ããªã±ã¼ã·ã§ã³ã®è¨å®èªä½ã¯ã§ããããã¼ã¿ãé©åã«è¤è£½ãããªãã®ã§è¨å®ãå¤ããå¿ è¦ãããã
ããã¯MySQL5.6 -> Aurora(MySQL5.6äºæ)移è¡ã®éãã¬ããªã±ã¼ã·ã§ã³ãçµãã ããæå»å¨ãã§ä¸æããããªãã£ãåé¡ã¨è§£æ±ºã®è¨é²ã
ããã¦ãã¯ã¦ãªã¨ã³ã¸ã㢠Advent Calendar 2018ã®2æ¥ç®ã®è¨äºã§ãã
åæ
件ã®ç§»è¡ã®éã®master以ä¸ã®ãããªè¨å®ã ã£ãã
mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
ã¾ããã¤ããªãã°å½¢å¼ã¯MIXED
ã§ãã£ãã
対ãã¦ãAuroraã®ããã©ã«ãè¨å®ã¯ãsystem_time_zone = UTC
ã§time_zone = SYSTEM
ã§ããã
mysql> show variables like â%time_zone%â; +------------------+------------+ | Variable_name | Value | +------------------+------------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+------------+ 2 rows in set (0.00 sec)
2018/11/29ç¾å¨ãAuroraã¯time_zone
ã®è¨å®ãå¤æ´ãããã¨ã¯ã§ãããsystem_time_zone
ãããã©ã«ãããå¤æ´ãããã¨ã¯åºæ¥ãªãã
æåã¯Auroraã®time_zone
ãAsia/Tokyo
ã«å¤æ´ããã ãã§okãã¨æã£ãããããã§ã¯æ°è¦ã®(Auroraã¸ã®)æ¸ãè¾¼ã¿åã¨mysqldumpããªã¹ãã¢åã¯ä¸æãè¡ããã¬ããªã±ã¼ã·ã§ã³ã§çæããããã¼ã¿(NOW()
ã®è¿ãå¤)ãmasterã¨ã¯ç°ãªããã¨ãããã£ãã
以ä¸ãå¿ è¦ã«ãªãåºç¤çãªç¥èã解説ããå¾ãåãè¡ã£ã解決ã示ãã
MySQLã®ã¿ã¤ã ã¾ã¼ã³è¨å®
MySQL(server)ã«ã¯ã¿ã¤ã ã¾ã¼ã³è¨å®ã2ã¤ããsystem_time_zone
ã¨time_zone
ãããã
mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.00 sec)
SYSTEM
ã¯system_time_zone
ãåç
§ããã¨ããæå³ã§ãã®å ´åJST
ã¨ãªããSYSTEM
以å¤ã«ãAsia/Tokyo
ã¨ãã£ãååä»ãã¿ã¤ã ã¾ã¼ã³ã+09:00
ã¨ãã£ãå¤ã使ããããµãã¼ã¿ã¤ã ãªã©ãèæ
®ããªãã§è¯ãæ¥æ¬ã§ã¯ä¸¡è
ã¯åãç¶æ
ã§ããã
system_time_zone
ã¯ãµã¼ãã¼ã®èµ·åæã«ä¸åº¦è¨å®ãããªã³ã©ã¤ã³ã®å¤æ´ã¯ä¸å¯ãtime_zone
ã¯ãªã³ã©ã¤ã³ã§å¤æ´å¯è½ã¨ãªã£ã¦ããã
ã¾ãtime_zone
è¨å®ã«éããªããMySQLã®è¨å®ã«ã¯ã»ãã·ã§ã³ã¨ã°ãã¼ãã«ã®2ã¤ã®ã¹ã³ã¼ããããã
ç´°ããæåã¯ããã§ã¯è§£èª¬ããªããã大ã¾ãã«è¨ã£ã¦ã°ãã¼ãã«ãªãã®ã使ããããã¯ã©ã¤ã¢ã³ãããç¹å¥ã«è¨å®ããã¨ã°ãã¼ãã«ã¨ã¯éãå¤ãè¨å®ã§ããã
TIMESTAMPåã¨DATETIMEå
TIMESTAMPåã¯å
é¨çã«ã¯1970-01-01 00:00:00 UTCããã®çµéç§ã§å¤ãä¿æãã¦ãã(unixtime)ãã¤ã¾ãMySQLã¯æ¿å
¥æã«ç¾å¨ã®ã¿ã¤ã ã¾ã¼ã³ãUTCã«å¤æãã¦ããunixtimeã§ä¿åããåç
§æã¯éã®ãã¨ãããããªã®ã§æ¿å
¥æã¨åç
§æã®time_zone
ãç°ãªã£ã¦ããã¨æå»ã®å¤ããã¨ãªããã¨ã«ãªããã¨ããããã¯time_zone
ã«ãã£ã¦ããæãã«è¡¨ç¤ºãã¦ãããã
ããã«å¯¾ãã¦DATETIMEåã¯åãªãæååããã®ã¾ã¾æ¿å
¥ããåç
§ãããã®ã§ã¿ã¤ã ã¾ã¼ã³ã¨ããæ¦å¿µããªããtime_zone
è¨å®ã®å½±é¿ãããããã¨ããªãã
ã¬ããªã±ã¼ã·ã§ã³ã»ã¼ã
ã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã¨ã¯ã¬ããªã±ã¼ã·ã§ã³å ã§æ£ãããã¼ã¿ãè¤è£½ããããã©ããã表ãæ¦å¿µã§ããããã¨ãã°MySQLã«ã¯é決å®æ§é¢æ°ã¨ãããã®ãããããããã®é¢æ°ã¯ã¹ãã¼ãã¡ã³ããã¼ã¹ã®ãã¤ããªãã°ã§ã¯ã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã§ã¯ãªããã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã«ããããã°è¡ãã¼ã¹ã®ãã¤ããªãã°å½¢å¼ãé¸ã¶å¿ è¦ãããã
NOW()
ã«ã¤ãã¦èãã¦ã¿ãã¨ãã¹ãã¼ãã¡ã³ããã¼ã¹ã§ãã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã§ãããä»çµã¿ã¨ãã¦ã¯ãNOW()
ãå¼ã°ããã¨ãã¤ããªãã°ã«ã¯TIMESTAMPå¤æ°ãè¨é²ããããNOW()
ã¯TIMESTAMPå¤æ°ãåç
§ãããããDATETIMEãªãã©ã«ã«å¤æãNOW()
ã®è¿ãå¤ã¨ãã¦ä½¿ãããããã£ã¦NOW()
ã¯ç¾å¨ã®æå»ãè¿ãé¢æ°ã§ãããªããã¹ãã¼ãã¡ã³ããã¼ã¹ã®ãã¤ããªãã°å½¢å¼ã§ãåºæ¬çã«ã¯ã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã¨ãªãã
éã«è¨ãã¨ã¹ãã¼ãã¡ã³ããã¼ã¹ã®ãã¤ããªãã°å½¢å¼ã§ãã¬ããªã±ã¼ã·ã§ã³ã»ã¼ããªããããã¤ããªãã°å½¢å¼ãMIXED
ã®å ´åãè¡ãã¼ã¹ã®ãã¤ããªãã°å½¢å¼ã¸ã¯ãã©ã¼ã«ããã¯ãããªãã
åºæ¬çã«ã¯ã¬ããªã±ã¼ã·ã§ã³ã»ã¼ãã¨æ¸ããã®ã¯æ¡ä»¶ããããmasterã¨slaveã®time_zone
ãåããã¨ã§ããã
masterã¨slaveã®time_zoneãéãå ´åã®ã¬ããªã±ã¼ã·ã§ã³
- master
system_time_zone = JST
time_zone = SYSTEM
- slave(Aurora)
system_time_zone = UTC
time_zone = Asia/Tokyo
ã®ãããªå ´åãèããã
masterã¨ãã¦ã¯
- DATETIMEåã¯JSTãæ³å®ããDATETIMEæåå
- TIMESTAMPåã¯æ¿å ¥æã«JSTã¨ãã¦DATETIMEæååå ->unixtimeã«å¤æãããå é¨è¡¨ç¾ ãè¨é²ããã¦ããã
ã¬ããªã±ã¼ã·ã§ã³ã®äºãèããªããã°ãããã§ãæ£ããåããã¤ã¾ããmysqldumpããªã¹ãããåã¨æ°è¦ã«Auroraã«æ¸ãè¾¼ã¾ããåã¯æ´åæ§ãä¿ã¦ãã
ã§ã¯ã¬ããªã±ã¼ã·ã§ã³ã§ã®è¤è£½ã¯ã©ãããããã¯æåã«æ¸ããããã«ãã¾ããããªãããªã«ãèµ·ãã£ã¦ãããã¨ããã¨ãmasterã®time_zone
ãSYSTEM
ã§ããããåããããã¤ããªãã°ã¯ä»¥ä¸ã®ãããªãã®ã«ãªãã
SET @@session.time_zone='SYSTEM'/*!*/; BEGIN /*!*/; # at 215 #181015 0:17:01 server id xxxx end_log_pos xxxx CRC32 0x9e0534e1 Query thread_id=25800848 exec_time=0 error_code=0 use `hoge_table`/*!*/; SET TIMESTAMP=1539530221/*!*/; replace hoge set id = xxxxxx, entrytime = NOW() /*!*/; # at 711 #181015 0:17:01 server id xxxx end_log_pos xxxx CRC32 0xdad0c08a Xid = 5435778 COMMIT/*!*/;
@@session.time_zone
ãSYSTEM
ã§ãããããNOW()
ã®ã¿ã¤ã ã¾ã¼ã³ã¯system_time_zone
ä¾åã«ãªãmaster/slaveã®system_time_zone
ãç°ãªã£ã¦ããå ´åDATETIMEåã®ã«ã©ã ã¯ã¬ããªã±ã¼ã·ã§ã³ã¢ã³ã»ã¼ãã¨ãªããã¡ãªã¿ã«TIMESTAMPåã®å ´åã¯ãã¾ããã(master/slaveã§åããã¼ã¿ãæ¸ãè¾¼ã¾ãã)ã
解決ç
1. slaveã®system_time_zone
ãJST
ã«å¤ãã
è¨å®ãæããã®ãçéã ããä»åã¯slaveãAuroraã ã£ãããsystem_time_zone
ãæããã®ã¯ä¸å¯è½ã§ããã
2. masterã®time_zone
ãAsia/Tokyo
ã«ãã
system_time_zone
çµç±ã§UTC
ãåç
§ããã¦ãã¾ãã®ãåå ã§ãããããæ示çã«Asia/Tokyo
ã«ãã¦ãããã°åé¡ã¯èµ·ãããªãã
3. ãã¤ããªãã°å½¢å¼ãè¡ãã¼ã¹ã«ãã
ããããããã§ããã¾ãããã¯ãï¼åççã«ã¯ãã¾ãããã¨æã£ã¦ãããã試ãã¦ã¯ããªãã詳ãã人ãããè£è¶³ãã ããã
ã©ãããã
çµå±2ãé¸ãã ãmasterã¨ãªãMySQLã§SET GLOBAL time_zone = '+9:00';
ããåèµ·åã«åãã¦my.confã該å½ç®æãæ¸ãæããã(+09:00ãªçç±ã¯ååä»ãã¿ã¤ã ã¾ã¼ã³ã®ãã¼ã¿ããã¼ãããã¦ããªãã£ããã)
ã¢ããªã±ã¼ã·ã§ã³ã®å¤æ´ã¯ç¹ã«è¡ã£ã¦ããªã(ã¯ã©ã¤ã¢ã³ãããtime_zone
ãè¨å®ãã¦ããå ´åãªã©ã¯å¿
è¦)ã
ãã£ã¦ããã£ããã¨
- ã°ãã¼ãã«å¤æ°ã®æ¸ãæããããã¨ã¯ä¸åº¦åæ¥ç¶ããªãã¨ã»ãã·ã§ã³å¤æ°ã¯æ¸ãæãããªã
- ããã£ã¦ãã¤ããã ãã©æ®æ®µãããªãã®ã§åãæ¿ããã...ã£ã¦ç¦ã£ã
- time_zoneã®è¨å®ã¯ã¬ããªã±ã¼ã·ã§ã³ã¸ã¯ä¼æ¬ã¯ããªã
- ããã¨æ¸ãã¦ãã£ãæ°ããããã©(ã©ãã«ï¼)ããªãã£ã
timez_zone
ãæ¸ãæãã£ãå¾ã«æ¥ç¶ãã¦ããã¯ã©ã¤ã¢ã³ããçºè¡ããã¯ã¨ãªã«ã¯SET @@session.time_zone='+09:00'/*!*/;
ãã¤ããã³ãã¯ã·ã§ã³ããã®ã¾ã¾ã®ã¯ã©ã¤ã¢ã³ãã®ã¯ã¨ãªã«ã¯SET @@session.time_zone='SYSTEM'/*!*/;
ãã¤ãã
ããã¦å
¨é¨SET @@session.time_zone='+09:00'/*!*/;
ã«ãªããã¤ã¾ãããã¡ã¤ã«ã®å
é ã«ä¸åº¦ã ãSET @@session.time_zone='+09:00'/*!*/;
ã¨æ¸ããããã¤ããªãã°ãåºæ¥ä¸ããã
ã¡ãªã¿ã«
ã¬ããªã±ã¼ã·ã§ã³ãå¤æ®µã§çµãã§ããå ´åã¯å¤§æ¬ã¨ãªã(該å½ã®ã¯ã¨ãªãç´æ¥åãã¦ãã)ãµã¼ãã¼ã®ã¿ã¤ã ã¾ã¼ã³ãå¤ããªãã¨æå³ããªãã
ãã¤ããªãã°ã«è¨é²ããã¦ããã¯ã¨ãªã¯åçãããã®ããã®ã¾ã¾è¨é²ããã®ã§ä¸çªå¤§æ¬ã®ã¿ã¤ã ã¾ã¼ã³ãæ¸ãæããªãéãSET @@session.time_zone='SYSTEM'/*!*/;
ã¯ãã®ã¾ã¾ã«ãªãã
çµãã
MySQL -> Auroraã®ã¬ããªã±ã¼ã·ã§ã³ãçµãéãããã§ããããã¤ã³ãã§ããã¿ã¤ã ã¾ã¼ã³ã®è¨å®ã«ã¤ãã¦èªåã§èª¿ã¹ã¦è§£æ±ºãããã¨ãã¾ã¨ãã¾ãããæè¿ã¯DBã®ã¿ã¤ã ã¾ã¼ã³ã¯UTCã«æãããã¨ãå¤ãã¨æãã¾ãããããã§ãªãã·ã¹ãã ãããããããã¨æãã®ã§åãåé¡ã§å°ã£ã¦ã人ã®åèã«ãªãã°å¹¸ãã§ããã¾ãããªã«ãééã£ã¦ããããä¸æ£ç¢ºãªé¨åãããã°ææãè²°ããã¨å¬ããã§ãã
ã¡ãªã¿ã«ç¾å¨ã¯masterã®åãæ¿ãä½æ¥ãçµããå®å ¨ã«Auroraã«ç§»è¡ãããå æ°ã«åãã¦ãã¾ãã
åèã«ãããã®
- 日々の覚書: MySQLのNOW関数はどのようにして安全にスレーブでリプレイされるのか
- NOW()ã®æåã«ã¤ãã¦æ¸ããã¦ãã¾ã
- オンプレMySQL~RDS for MySQL/Aurora間のレプリケーションにおけるタイムゾーン設定 - Qiita
- åãåé¡ã«åãçµãã§ãã¾ã
- 以ä¸MySQLããã¥ã¡ã³ãã®é¢ä¿ããé¨åã§ã
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.6 MySQL Server でのタイムゾーンのサポート
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.4 SET 構文
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.1 DATE、DATETIME、および TIMESTAMP 型
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 5.1.4 サーバーシステム変数
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.4.1.30 レプリケーションとタイムゾーン
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.4.1.15 レプリケーションとシステム関数
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.1.2.1 ステートメントベースおよび行ベースレプリケーションのメリットとデメリット
- MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.4.1.30 レプリケーションとタイムゾーン