2013-03-04 13 views
12

हम एडब्ल्यूएस आरडीएस इंस्टेंस पर नवीनतम MySQL सर्वर का उपयोग करते हैं और हमने इसे यूएस-ईस्ट डेटा सेंटर पर चलाने के लिए कॉन्फ़िगर किया है। हम मानते हैं कि कोई भी नई तिथि() या Time.now() आमंत्रण दिनांक उस समय संग्रहीत करेगा जिसमें डेटाबेस सर्वर चल रहा है।एडब्ल्यूएस आरडीएस इंस्टेंस के लिए डेटाबेस टाइमज़ोन कैसे सेट करें

क्या पीएसटी टाइमज़ोन को इंगित करने के लिए यूएस-ईस्ट पर चल रहे मेरे एडब्ल्यूएस आरडीएस इंस्टेंस को इंगित करने का कोई तरीका है, ताकि तिथि की कोई भी स्थिरता ईएसटी के बजाय पीएसटी में मूल्यों को संग्रहित करे। (यानी यदि किसी ऑब्जेक्ट को लगभग 10 पूर्वाह्न ईएसटी स्टोर करते हैं, तो डीबी कॉलम को इसके बजाय 7 पूर्वाह्न ईएसटी प्रतिबिंबित करना चाहिए)।

उत्तर

35

मेरे बाकी उत्तर से पहले, मैं अभी यह सिफारिश करना चाहूंगा कि यदि आपके पास यूटीसी का उपयोग करने के लिए अपना आवेदन बदलने का कोई विकल्प है तो यह आपको भविष्य में और भविष्य में बहुत दुःख बचाएगा।

हालांकि आपके प्रश्न के संदर्भ को देखते हुए, मुझे लगता है कि यह एक विकल्प नहीं है और आप पारंपरिक सर्वर वातावरण में MySQL का उपयोग करने के लिए डिज़ाइन की गई प्रणाली को अनुकूलित कर रहे हैं, जहां आप केवल टाइमज़ोन बदल सकते हैं, और कोड तर्क है जो इस टाइमज़ोन की अपेक्षा करता है और यूटीसी का उपयोग करने के लिए आसानी से अनुकूलित नहीं किया जा सकता है।

लेकिन यदि आपको वास्तव में पीएसटी के रूप में स्टोर करने की आवश्यकता है, तो पढ़ें।


आप सही है कि MySQL डिफ़ॉल्ट रूप से टाइमस्टैम्प भंडारण के लिए सर्वर के समय क्षेत्र का उपयोग करेगा कर रहे हैं, फिर भी अपने धारणा RDS कि उदाहरणों उनके समय क्षेत्र है जिसमें वे का शुभारंभ कर रहे हैं एडब्ल्यूएस क्षेत्र के आधार पर निर्धारित किया है गलत है - सभी आरडीएस उदाहरणों अपने समय क्षेत्र यूटीसी के रूप में सेट के साथ शुरू कर रहे हैं, and this configuration can't be changed:

The time zone is currently not modifiable. There is indeed a Parameter value in rds-describe-db-parameters called "default_time_zone" but it's marked as not modifiable.

तो अपने ही एकमात्र विकल्प प्रत्येक कनेक्शन आपके आवेदन पीएसटी डेटाबेस उदाहरण के लिए बनाता है पर समय क्षेत्र सेट करने के लिए है। आप हर कनेक्शन के लिए एक आवेदन दो चरणों found here का पालन करके बनाता में निष्पादित करने के लिए SET SESSION time_zone = 'PST' क्वेरी का उपयोग कर सकते हैं:

  1. निम्न संग्रहीत प्रक्रिया बनाएं (UTC-8 पीएसटी है):

    DELIMITER | 
    CREATE PROCEDURE mysql.store_time_zone() 
        IF NOT (POSITION('[email protected]' IN CURRENT_USER()) = 1) THEN  
         SET SESSION time_zone = '-8:00'; 
        END IF 
    | 
    DELIMITER ; 
    
  2. कनेक्ट

    $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate" 
    
  3. आपप्रदान करने की आवश्यकता हो सकता है: आपके उदाहरण के लिए, और निम्न कमांड चलाएं उन है कि डेटाबेस से कनेक्ट हो जाएगा करने के लिएअनुमतियाँ, अन्यथा आप एक कनेक्शन त्रुटि मिल सकता है:

    GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'host'; 
    

अब किसी भी ग्राहक द्वारा अपने आरडीएस उदाहरण के खिलाफ मार डाला पीएसटी का उपयोग करना चाहिए, प्रत्येक क्वेरी के किसी भी आवेदन तर्क को संशोधित किए बिना और डेटाबेस में किसी भी पूर्व-संग्रहीत टाइमस्टैम्प को अपडेट करने की आवश्यकता के बिना।

+13

डेलाइट बचत को संभालने के लिए अपना नामित टाइमज़ोन सेट करना बेहतर समाधान होगा। मैं लाइन को बदलने का सुझाव देता हूं: SET SESSION time_zone = 'यूएस/प्रशांत'; –

+0

मैं पिछली टिप्पणी पर तनाव डालना चाहता हूं, नाम टाइमोन वास्तव में डेलाइट बचत में दर्द बचाता है, जीएमटी के बारे में भी जागरूक रहें, क्योंकि इसमें डेलाइट सेविंग ऑफसेट नहीं है – Zavael

+0

@ थॉमसपेन इस समाधान का मेरा एकमात्र डर यह है कि, यह हर नए उपयोगकर्ता को लगता है जिसे इस डेटाबेस में जोड़ा गया है, को इस डेटाबेस फ़ंक्शन तक पहुंच प्राप्त करनी होगी या यह काम नहीं करेगा, सही? अन्य डेटाबेस और उनके उपयोगकर्ताओं के बारे में क्या।क्या मैं इस संग्रहीत प्रक्रिया के साथ डेटाबेस बना सकता हूं और किसी भी तरह से सुनिश्चित कर सकता हूं कि हर कोई डिफ़ॉल्ट रूप से इसका उपयोग कर सके? – Neo

संबंधित मुद्दे