Mysql時間とローカル時間が一致しない&Linux時間とタイムゾーンを設定または変更する正しい方法

4238 ワード

仕事の過程は開発に出会って私にデータベースの時間と現在の時間が一致しないことを教えてくれて、そこで調べて、システムの時間が現在の時間ではないことを発見して、そこで資料を探して以下のように整理して、他の人を助けることができることを望みます.
一、Mysql時間と本機時間が一致しない
mysqlコマンドラインモードで動的に変更
1.mysql現在時刻、現在タイムゾーンの表示
(root@localhost) [(none)]>select now();
+---------------------+
| now()               |
+---------------------+
| 2018-12-07 02:30:06 |
+---------------------+
1 row in set (0.00 sec)
(root@localhost) [(none)]> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | EST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
(root@localhost) [(none)]>

time_zone説明mysqlがsystemを使用するタイムゾーンsystem_time_zoneはsystemがESTタイムゾーンを使用することを説明する
2、タイムゾーンの修正
一時的に有効になる
set global time_zone = '+8:00'; ##  mysql         ,       8 
set time_zone = '+8:00'; ##        
flush privileges; #    

永久に有効になるmy.cnfプロファイルによるタイムゾーンの変更
vim /etc/my.cnf ## [mysqld]     
default-time_zone = '+8:00'
/etc/init.d/mysqld restart ##  mysql      

二、Linux時間とタイムゾーンを設定または修正する正しい方法
まずlinuxシステムの時間を理解します
linuxシステム時間は2つあります.1つはハードウェア時間、すなわちBIOS時間です.CMOS設定を行ったときに見た時間です.もう1つはシステム時間です.linuxシステムKernel時間です.Linuxが起動すると、システムKernelはハードウェアクロックの設定を読み取り、システムクロックはハードウェアとは独立して動作します.システムクロックとハードウェアクロックが一致しない場合があるため、時間同期を実行する必要があります.
1)システムクロックとハードウェアクロックの同期を確認する
1、dateシステム時間の表示/設定
1、      2018 10 6 
[root@linux ~]# date -s 10/06/18
2、      11 12 13 
[root@linux ~]# date -s 11:12:13
3、      2018 10 6 11 12 13 (MMDDhhmmYYYY.ss)
[root@linux ~]# date 1006111218.13

2、hwclock/clockハードウェア時間の表示/設定
1、        (        )
[root@linux ~]# hwclock  --show
[root@linux ~]# clock  --show
2、      (        )
[root@linux ~]# hwclock --set --date="10/06/18 12:13" ( / /  : : )
[root@linux ~]# clock --set --date="10/06/18 12:13" ( / /  : : )

3、同期システム及びハードウェアクロック
1、           (        )
[root@linux ~]# hwclock --hctosys
[root@linux ~]# clock --hctosys  
  :hc      ,sys      ,        ,           
2、           (        )
[root@linux ~]# hwclock --systohc
[root@linux ~]# clock --systohc 
  :        ,           

2)タイムゾーンの変更
まずタイムゾーンについて
CentOSとUbuntuのタイムゾーンファイルは/etc/localtimeですが、CentOS 7以降はlocaltimeとリンクファイルになります
[root@centos7 ~]# ll /etc/localtime 
lrwxrwxrwx 1 root root 33 Oct 15  2017 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai

直接cpでシステムタイムゾーンを修正すると、リンクされたファイルが修正されます.例えば、アメリカのタイムゾーンファイルの内容を上海のタイムゾーンコンテンツに変更すると、一部のプログラミング言語やプログラムがシステムタイムゾーンを読み取るときにエラーが発生する可能性があります.
タイムゾーンの正しい変更方法
1、CentOS6、Ubuntu16
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

2、CentOS 7、RHEL 7等
        timedatectl  
# timedatectl list-timezones |grep Shanghai    #           
# timedatectl set-timezone Asia/Shanghai    #        

           
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3、プロファイルを修正してタイムゾーンを修正する
[root@linux ~]# echo "ZONE=Asia/Shanghai" >> /etc/sysconfig/clock         
[root@linux ~]# rm -f /etc/localtime
#                
[root@linux ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

まとめ:
私のシーンはmysqlデータベースの時間と現在の時間が一致せず、システムタイムゾーンの問題です.その後、このシステムタイムゾーンはESTアメリカタイムゾーンであり、お客様が提供するシステムであり、システムを導入する際にタイムゾーンを選択していないことがわかりました.データベースを停止することはできません.そのため、上のように、このデータベースのグローバル設定set global time_zone = '+8:00';その後、データベース時間は正常になります(説明:system_time_zoneという値は、データベースがシステムから読み出しを開始して生成した読み取り専用変数であり、変更できません).そして私のシステムはcentos 7です.4であるため、timedatectlコマンドを使用してシステムタイムゾーンを変更するのが最も便利であり、データベースが再起動してもシステムが再起動しても正しいタイムゾーンである.
[root@linux ~]# timedatectl set-timezone Asia/Shanghai
[root@linux ~]# timedatectl status
      Local time: Fri 2018-12-07 11:11:39 CST
  Universal time: Fri 2018-12-07 03:11:39 UTC
      RTC time: Fri 2018-12-07 11:11:37
      Time zone: Asia/Shanghai (CST, +0800)
      NTP enabled: yes
      NTP synchronized: yes
      RTC in local TZ: yes
      DST active: n/a
 [root@linux ~]#