Trong bài viết này, chúng tôi sẽ thảo luận về cách bạn có thể thay đổi múi giờ MySQL trên máy chủ của mình để dữ liệu được lưu trữ trong cơ sở dữ liệu của bạn theo mặc định sẽ sử dụng múi giờ mà bạn đã chỉ định
Rất nhiều lúc múi giờ địa phương của bạn sẽ khác với múi giờ của máy chủ MySQL và điều này có thể khiến bạn khó làm việc với dữ liệu bên trong cơ sở dữ liệu hơn. Sử dụng các bước sau, bạn có thể cập nhật múi giờ của máy chủ MySQL sao cho khớp với múi giờ của bạn để làm việc với dữ liệu này dễ dàng hơn
Thay đổi này sẽ yêu cầu quyền truy cập root vào VPS [Máy chủ riêng ảo] hoặc gói lưu trữ máy chủ chuyên dụng hoặc bạn có thể liên hệ với bộ phận hỗ trợ của chúng tôi để thay đổi điều này trên máy chủ của bạn. Bạn cũng có thể chỉ cần biết cách chuyển đổi thời gian MySQL không yêu cầu quyền truy cập root và có thể được thực hiện trên máy chủ dùng chung
Không có thời gian để đọc hướng dẫn đầy đủ?Thay đổi múi giờ trong MySQL
- Đăng nhập vào máy chủ của bạn thông qua SSH với tư cách là người dùng root
- Bạn có thể xem cài đặt múi giờ hiện tại của MySQL bằng lệnh sau từ bảng điều khiển.
mysql -e "SELECT @@global.time_zone;"
Theo mặc định, bạn sẽ lấy lại một cái gì đó tương tự như.
______103Điều này là do theo mặc định, múi giờ MySQL của bạn sẽ được đặt thành thời gian HỆ THỐNG mặc định của máy chủ. Nếu bạn quan tâm đến việc thay đổi toàn bộ múi giờ của máy chủ, điều này có thể được thực hiện bằng cách đặt múi giờ trong WHM
- Bạn có thể xem dấu thời gian HỆ THỐNG của máy chủ bằng cách sử dụng lệnh sau.
date
Điều này sẽ trả lại một cái gì đó tương tự như thế này.
______104 - Bạn có thể xem dấu thời gian hiện tại được báo cáo bởi máy chủ MySQL bằng lệnh sau.
mysql -e "SELECT NOW[];"
Điều này sẽ trả lại dấu thời gian hiện tại.
______10 - Bây giờ bạn có thể chỉnh sửa tệp cấu hình MySQL bằng trình soạn thảo văn bản yêu thích của mình.
vi /etc/my.cnf
Sau đó chạy dòng sau để thay đổi từ EST [GMT -5. 00] đến CST [GMT -6. 00].default-time-zone = '-06:00'
Bây giờ hãy lưu /etc/my. cnf với mặc định mới của bạn. - Để kích hoạt thay đổi, bạn sẽ muốn khởi động lại dịch vụ MySQL bằng lệnh sau.
service mysql restart
- Bây giờ nếu bạn thử xem lại cài đặt múi giờ toàn cầu bằng lệnh.
mysql -e "SELECT @@global.time_zone;"
Bây giờ, bạn sẽ lấy lại mặc định mới của mình.
______11 - Bây giờ bạn cũng sẽ thấy rằng hàm NOW[] cũng đã được cập nhật.
mysql -e "SELECT NOW[];"
Điều này sẽ trả lại dấu thời gian hiện tại.
______12
Bây giờ bạn đã biết cách cập nhật cài đặt múi giờ của máy chủ MySQL, để giúp đảm bảo dữ liệu được lưu trữ trong cơ sở dữ liệu dễ dàng cho bạn làm việc với. Bạn cũng có thể sử dụng các múi giờ được đặt tên thay vì GMT -6. 00, nhưng điều này trước tiên sẽ yêu cầu bạn tải các bảng múi giờ vào cơ sở dữ liệu mysql. Thông tin thêm về điều này có thể được tìm thấy trên trang MySQL liên quan đến mysql_tzinfo_to_sql và tải các bảng múi giờ
Việc xử lý múi giờ đôi khi có thể gây nhầm lẫn, đặc biệt là khi xử lý việc di chuyển dữ liệu sang một máy chủ khác chạy trên một múi giờ khác, khi chuyển sang múi giờ Giờ tiết kiệm ánh sáng ban ngày [DST] hoặc khi giới thiệu giây nhuận. Ngày được lưu trữ có còn ý nghĩa sau khi thay đổi cấu hình toàn hệ thống không?
Có rất nhiều tài liệu về MySQL và quản lý múi giờ, nhưng cũng có thông tin bị thiếu vì các tính năng và bản sửa lỗi mới liên tục được đưa vào Máy chủ MySQL trong lĩnh vực này. Vì vậy, tôi nghĩ rằng dành một vài từ ở đây để tóm tắt cách xử lý múi giờ tốt nhất và cập nhật thông tin này để phản ánh việc triển khai hiện tại có thể là một ý kiến hay
Các chương Toàn cầu hóa MySQL ghi lại mọi thứ bạn cần biết để xử lý các múi giờ và bộ ký tự
Cài đặt múi giờ MySQL
Trước hết, hãy tóm tắt các tham số cấu hình ảnh hưởng đến cách MySQL hoạt động với các múi giờ là gì. Có thể định cấu hình múi giờ bằng các tham số sau
- –timezone Điều này được sử dụng với mysqld_safe và đặt biến môi trường TZ thành múi giờ mong muốn
- system_time_zone Điều này tương ứng với múi giờ được kế thừa từ TZ được định cấu hình hệ điều hành hoặc múi giờ được định cấu hình qua mysqld_safe với –timezone
- time_zone Điều này khởi tạo múi giờ cho các kết nối máy khách, thường được mặc định là HỆ THỐNG, do đó kế thừa cùng một giá trị như system_time_zone. Nếu khách hàng muốn cài đặt múi giờ khác, hãy sử dụng biến này
- –công cụ sửa đổi dòng lệnh default-time-zone khởi tạo time_zone thành giá trị mặc định mong muốn
- log_timestamps Nó đặt múi giờ của dấu thời gian trong các thông báo được ghi vào nhật ký lỗi, nhật ký truy vấn chung và truy vấn chậm. Giá trị mặc định là UTC
Ngoài ra còn có một cài đặt khác đáng lưu ý và đó là thời gian hiện tại của khách hàng, có thể định cấu hình bằng cách sử dụng biến dấu thời gian. Không thực sự liên quan đến múi giờ, nhưng đáng để biết. Nó đặt thời gian mong muốn để khách hàng khôi phục từ e. g. nhật ký nhị phân và bao gồm câu lệnh NOW[]. Vì vậy, nó ảnh hưởng đến giá trị được trả về bởi NOW[]
MySQL kế thừa múi giờ của hệ điều hành
Một trong những tùy chọn khả thi để thay đổi múi giờ của hệ thống MySQL là thay đổi múi giờ của hệ điều hành. MySQL sẽ kế thừa múi giờ của hệ điều hành để khởi tạo
date19 khi bắt đầu. Hãy xem lại các lệnh sẽ được sử dụng trong Linux để đọc cài đặt múi giờ hiện tại của hệ điều hành
Khám phá múi giờ hiện tại
date2____13
Thay đổi múi giờ
date4
Liệt kê các múi giờ có sẵn
date5
Thay đổi múi giờ của hệ thống MySQL và máy khách
Thay vì thay đổi múi giờ của hệ điều hành để nó được tải vào thời điểm bắt đầu của MySQL [lần lượt khởi tạo
date19], có thể đặt MySQL
date19 bằng một trong hai cách sau:
- Đặt biến môi trường TZ
- Khởi động lại máy chủ bằng cách sử dụng –timezone với
date
82
Lưu ý rằng sử dụng một trong hai phương pháp sẽ không thành công với lỗi sau nếu các vùng không được nhập vào MySQL trước
date1
Kết quả tương tự nếu cố gắng đặt time_zone
date8
Sau đó, hãy nhập thông tin múi giờ vào MySQL, tận dụng lợi thế của mysql_tzinfo_to_sql
mysql -e "SELECT NOW[];"1
Các cảnh báo có thể bị bỏ qua, chúng được báo cáo khi công cụ cố gắng nhập các tệp linh tinh không liên quan được lưu trữ trong thư mục
date83. Bây giờ các bảng vùng đã được tải vào MySQL, có thể xác minh chúng
mysql -e "SELECT NOW[];"3
Hiện có thể đặt múi giờ hệ thống mong muốn bằng cách đặt biến môi trường tương ứng [nó sẽ cần khởi động lại]
mysql -e "SELECT NOW[];"4
Phương pháp thay thế để đặt múi giờ hệ thống đang sử dụng –timezone với
date82. Sau khi khởi động lại máy chủ, hiện đã hoàn tất thành công, hãy kiểm tra
mysql -e "SELECT NOW[];"6
Tùy chọn này sẽ tránh thay đổi múi giờ của hệ điều hành. Các giá trị có thể có cho –timezone hoặc TZ phụ thuộc vào hệ thống. Tham khảo tài liệu hệ điều hành của bạn để xem giá trị nào được chấp nhận. Giờ đây, khách hàng có thể đặt
date85 thành múi giờ mong muốn tùy ý cho phiên
date30
Di chuyển máy chủ
Hãy xem điều gì sẽ xảy ra với dữ liệu được lưu trữ khi múi giờ của hệ điều hành thay đổi [hoặc thay đổi là bắt buộc, như thường lệ, do thay đổi đối với biến môi trường TZ]. Hãy chú ý đến
date86. Nếu chúng ta chèn một bảng
date31
Với dữ liệu
date32
Và sau đó chúng tôi cố gắng truy xuất nó, nó sẽ chính xác cho đến khi chúng tôi vẫn giữ nguyên cài đặt múi giờ
date33
Nhưng nếu chúng tôi khởi động lại máy chủ trên một múi giờ khác [e. g. một máy chủ sử dụng một biến môi trường TZ khác]
date34
Sau đó, DATETIME sẽ được giữ nguyên, nhưng DẤU THỜI GIAN sẽ được diễn giải bằng cách sử dụng
date85 khác, kế thừa từ
date86. Đây là điểm khác biệt của DATETIME với TIMESTAMP. DATETIME luôn được đọc "nguyên trạng", trong khi TIMESTAMP được tính theo phiên
date85
date35
Tại thời điểm này, có thể làm cho múi giờ của máy chủ thay đổi không ảnh hưởng đến kết quả bằng cách đặt
date36
tuyên bố hữu ích
Cho đến nay, bạn đã thấy mối quan hệ giữa HĐH và MySQL liên quan đến cài đặt múi giờ là gì. Trước khi xem xét các ví dụ khác, đây là một số câu lệnh MySQL có thể hữu ích
Chọn một cột dấu thời gian ở định dạng UTC
date37
Chọn ngày giờ hiện tại trong múi giờ phiên
date38
date39
Chọn ngày giờ hiện tại theo UTC
date40
date41
Lấy đồng bằng múi giờ hiện tại từ UTC
date42
Nhận dấu thời gian UNIX hiện tại [tính bằng giây]
date43
date44
DẤU THỜI GIAN, DATETIME và chênh lệch múi giờ
Trước khi xem xét sâu về sự khác biệt giữa TIMESTAMP và DATETIME, hãy nhớ rằng MySQL Server 8. 0. 19 độ lệch múi giờ được giới thiệu, cho phép chỉ định ngày ở định dạng này
date45
Kiểm tra ghi chú phát hành, yêu cầu tính năng và nhật ký công việc liên quan. Bây giờ tôi sẽ chia sẻ một số chi tiết về lưu trữ và truy xuất giá trị ngày giờ và dấu thời gian
sự kiện DẤU THỜI GIAN
Từ mô tả nhật ký công việc, chúng tôi có
- DẤU THỜI GIAN không có độ lệch được lưu trữ trong UTC, do đó được chuyển đổi thành UTC từ
mysql -e "SELECT NOW[];"
10 hiện tại - DẤU THỜI GIAN có độ lệch. Giá trị ngày/giờ nội bộ sẽ được điều chỉnh thành UTC bằng cách trừ đi phần bù múi giờ [nhưng không phải là
mysql -e "SELECT NOW[];"
10] trước khi được lưu trữ - DẤU THỜI GIAN khi đọc được chuyển thành
mysql -e "SELECT NOW[];"
10 của kết nối tương ứng
sự kiện DATETIME
- DATETIME không có phần bù được lưu trữ "nguyên trạng" và được coi là được lưu trữ trong
mysql -e "SELECT NOW[];"
10 cục bộ - DATETIME với phần bù. Giá trị ngày/giờ nội bộ sẽ được điều chỉnh thành UTC bằng cách trừ đi phần bù múi giờ và điều chỉnh giá trị ngày/giờ thành giờ địa phương bằng cách thêm giá trị của biến phiên
mysql -e "SELECT NOW[];"
10, trước khi được lưu trữ - DATETIME được đọc “nguyên trạng” bất kể
mysql -e "SELECT NOW[];"
10. Nó phải được giải thích liên quan đến ngữ cảnh mà nó được đặt [cục bộmysql -e "SELECT NOW[];"
10] và ứng dụng phải tính đến điều đó
ví dụ
Sử dụng lại định nghĩa bảng này
date31
Với các cài đặt múi giờ này
date47
Hãy chèn một số dữ liệu
date48
date49
Hàng đầu tiên có
- ngày giờ có bù '2017-11-13 10. 20. 19+04. 00′ được chuyển thành UTC, do đó ‘2017-11-13 06. 20. 19’ UTC
- Ngày giờ UTC sau đó được lưu dưới dạng giờ địa phương [EST] áp dụng cho
mysql -e "SELECT NOW[];"
10, tức là ‘-05. 00. 00’ [CHỌN TIMEDIFF[NOW[], UTC_TIMESTAMP];] - đưa chúng ta đến giờ địa phương ‘2017-11-13 01. 20. 19 EST. Điều này sẽ được lưu trữ và sẽ được trả lại bất kể là
mysql -e "SELECT NOW[];"
10 hiện tại - phần bù không còn khả dụng nữa, khi ngày giờ được lưu trữ. Phải là khách hàng biết rằng điều này đã được lưu trữ trong EST. Thông thường, một tùy chọn thuận tiện sẽ được lưu trữ trong UTC, do đó, với
mysql -e "SELECT NOW[];"
10=‘UTC’ - dấu thời gian được chuyển thành UTC, do đó '2017-11-13 10. 20. 19+04. 00’ trở thành ‘2017-11-13 06. 20. 19’ bằng cách áp dụng phần bù, nhưng không phải
mysql -e "SELECT NOW[];"
10 - Nó được lưu trữ ở dạng UTC, sau đó nó được lưu trữ dưới dạng '2017-11-13 06. 20. 19’ UTC
- khi đọc, nó được chuyển đổi sang múi giờ địa phương
mysql -e "SELECT NOW[];"
10 [khác với ngày giờ, không được chuyển đổi mà đọc “nguyên trạng”], sau đó áp dụng phần bù ‘-05. 00. 00’ [EST] nó trả về ‘2017-11-13 01. 20. 19’
hàng thứ hai
- ngày giờ là giờ EST địa phương và được lưu trữ "nguyên trạng" và được đọc là "nguyên trạng". Vậy là '2018-11-13 10. 20. 19’
- dấu thời gian được lưu trữ ở dạng UTC ‘2017-11-13 15. 20. 19' [không có phần bù, phải áp dụng
mysql -e "SELECT NOW[];"
10 để có chuyển đổi EST thành UTC], nhưng giá trị đọc trả về '2018-11-13 10. 20. 19’, bởi vì dấu thời gian được chuyển đổi thành giờ địa phươngmysql -e "SELECT NOW[];"
10 [EST]
Hãy chơi một chút
date50
date51
Liệu nó có ý nghĩa? . Vì vậy, nó được trả lại theo cách nó được lưu trữ trong đoạn văn trước
Ví dụ DATETIME và TIMESTAMP
Lần đầu tiên khi tôi kiểm tra các ví dụ từ tài liệu, tôi thừa nhận rằng tôi đã phải suy nghĩ trong giây lát. Nhưng đề cập đến các quy tắc được tóm tắt trước đây là “sự thật”, mọi thứ đều rõ ràng và mạch lạc. Hãy đi qua ví dụ từng bước. Hãy xem xét múi giờ của hệ thống EST
date52
Điều đó có sự thay đổi sau từ UTC
date53
Sau đó, hãy tạo các bảng để kiểm tra cả hai loại
date54
date55
Và chúng ta hãy tiến hành chèn dữ liệu vào bảng DATETIME
date56____157
Đây là những gì được trả về từ bảng DATETIME
date58
Giải thích [xem các sự kiện DATETIME trước đó để biết các quy tắc]
- ‘2020-01-01 10. 10. 10’ là EST, được lưu trữ và đọc như vậy
- ‘2020-01-01 10. 10. 10+05. 30’ là ‘2020-01-01 04. 40. 10’ UTC, được chuyển đổi thành EST là ‘2019-12-31 23. 40. 10', được lưu trữ và đọc như vậy
- ‘2020-01-01 10. 10. 10-08. 00’ là ‘2020-01-01 18. 10. 10’ UTC, được chuyển đổi thành EST là ‘2020-01-01 13. 10. 10', được lưu trữ và đọc như vậy
- ‘2020-01-01 10. 10. 10' là UTC, được lưu trữ và đọc như vậy [
mysql -e "SELECT NOW[];"
10 đã được đặt thành '+00. 00’] - ‘2020-01-01 10. 10. 10+05. 30′ là ‘2020-01-01 04. 40. 10' UTC, được lưu trữ và đọc như vậy [
mysql -e "SELECT NOW[];"
10 đã được đặt thành '+00. 00’] - ‘2020-01-01 10. 10. 10-08. 00’ là ‘2020-01-01 18. 10. 10' UTC, được lưu trữ và đọc như vậy [
mysql -e "SELECT NOW[];"
10 đã được đặt thành '+00. 00’]
Bây giờ hãy chèn bảng TIMESTAMP
date59
date57
Đây là những gì được trả về từ bảng TIMESTAMP
date11
Giải thích [xem các sự kiện TIMESTAMP trước đó để biết các quy tắc]
- ‘2020-01-01 10. 10. 10’ được điều chỉnh thành UTC và được lưu dưới dạng ‘2020-01-01 13. 10. 10’ nhưng đọc là EST ‘2020-01-01 10. 10. 10’
- ‘2020-01-01 10. 10. 10+05. 30’ được lưu dưới dạng ‘2020-01-01 04. 40. 10’ UTC, nhưng đọc là EST [UTC -05. 00] là ‘2019-12-31 23. 40. 10’
- ‘2020-01-01 10. 10. 10-08. 00’ được lưu dưới dạng ‘2020-01-01 18. 10. 10’ UTC nhưng đọc là EST [UTC -05. 00] là ‘2020-01-01 13. 10. 10’
- ‘2020-01-01 10. 10. 10’ đã là UTC, được lưu trữ như vậy và đọc ‘2020-01-01 05. 10. 10’
- ‘2020-01-01 10. 10. 10+05. 30’ được lưu dưới dạng ‘2020-01-01 04. 40. 10’ UTC nhưng đọc là EST [UTC -05. 00] là ‘2019-12-31 23. 40. 10’
- ‘2020-01-01 10. 10. 10-08. 00’ được lưu dưới dạng ‘2020-01-01 18. 10. 10’ UTC nhưng đọc là EST [UTC -05. 00] là ‘2020-01-01 13. 10. 10’
Ví dụ UNIX_TIMESTAMP
Một lần nữa chúng ta hãy xem việc sử dụng offset để có các chuỗi UTC rõ ràng. Khi một phần bù được chỉ định, sẽ không có phép tính nào đối với @@time_zone. nghĩa đen đã được thể hiện dưới dạng UTC, nó được chuyển đổi thành UTC mà không cần bù đắp cho việc sử dụng/lưu trữ
date12
date13
Điều này đang chuyển đổi dấu thời gian có độ lệch thành '2015-11-13 09. 20. 19' và trả về giây kể từ '1970-01-01 00. 00. 00’ UTC. Bây giờ chúng ta hãy thay đổi
mysql -e "SELECT NOW[];"10
date14
date15
Dấu thời gian ở địa phương
mysql -e "SELECT NOW[];"10, CET, là UTC+1. Vì vậy, những giây kể từ '1970-01-01 00. 00. 00’ UTC được trả lại cho ‘2015-11-13 09. 20. 19’
Bây giờ, chuyển sang địa phương với UTC
date50
Chữ ‘2015-11-13 09. 20. 19' không cần bất kỳ chuyển đổi nào, nó đã sẵn sàng để đưa vào UNIX_TIMESTAMP vì nó đã là UTC
date17
Điểm rút ra & khuyến nghị
- Đặt
date
19 bằng cách đặt biến môi trường TZ. Nó cũng có thể được chỉ định bằng cách sử dụng tùy chọnmysql -e "SELECT NOW[];"
42 củadate
82 - Nếu múi giờ thay đổi trên máy chủ [e. g. thay đổi múi giờ DST], cần phải khởi động lại máy chủ để nó được phản ánh tới
date
19 - Để đặt @@time_zone toàn cầu, hãy khởi động máy chủ với
mysql -e "SELECT NOW[];"
45 mysql -e "SELECT NOW[];"
10 có thể được đặt cho mỗi phiên- Nếu
mysql -e "SELECT NOW[];"
10 được đặt thành HỆ THỐNG, mọi lệnh gọi hàm MySQL yêu cầu tính toán múi giờ sẽ thực hiện lệnh gọi thư viện hệ thống để xác định múi giờ hệ thống hiện tại. Cuộc gọi này có thể được bảo vệ bởi một mutex toàn cầu, dẫn đến tranh chấp - Đặt mọi thứ thành UTC sẽ bỏ qua tất cả các vấn đề về nhầm lẫn múi giờ và sự mơ hồ của DST
- Một tùy chọn để lưu trữ DATETIME và tránh nhầm lẫn sẽ là lưu trữ ngày và giờ dưới dạng cột DATETIME và lưu trữ múi giờ [như “America/Los_Angeles”] trong một cột VARCHAR khác
- CONVERT_TZ cần bản gốc
date
85 - Các cột DATETIME không bị thay đổi bởi cài đặt múi giờ cơ sở dữ liệu sau khi được lưu trữ. Chúng sẽ lưu trữ và truy xuất cùng một giá trị mọi lúc, độc lập với múi giờ của máy khách đã định cấu hình
- Kiểm tra các trường hợp phụ khi chuyển đổi loại được thực hiện trong so sánh
- Luôn cập nhật với những thay đổi về múi giờ
- Sử dụng so sánh UTC để loại bỏ các vấn đề với giây nhảy vọt, kiểm tra tài liệu
- Bắt đầu với MySQL 8. 0. 22, CAST[] hỗ trợ truy xuất giá trị DẤU THỜI GIAN như ở UTC, sử dụng toán tử AT TIMEZONE
- Kể từ MySQL 8. 0. 26, ngoài khởi tạo thời gian khởi động, nếu múi giờ của máy chủ lưu trữ thay đổi [ví dụ: do thời gian tiết kiệm ánh sáng ban ngày],
date
86 phản ánh sự thay đổi đó - Và những gì về nhân rộng?
MDS thì sao?
Và nếu bạn đang thắc mắc về cài đặt mặc định múi giờ cho Hệ thống cơ sở dữ liệu dịch vụ cơ sở dữ liệu MySQL, thì đây là
date18
Phần kết luận
Tôi đã chia sẻ một số điểm cơ bản cần lưu ý khi lập kế hoạch lưu trữ ngày và giờ. Tôi sẽ viết nhiều hơn trong tương lai để quan tâm đến khách hàng [chẳng hạn như thời gian C/J và đề xuất]. Tôi hy vọng bản tóm tắt này sẽ hữu ích và vui lòng bình luận để chia sẻ các đề xuất, nghi ngờ và báo cáo bất kỳ trường hợp phụ nào mà bạn biết. Cảm ơn vì đã đọc