Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

संग्रहीत प्रक्रिया जो MYSQL में 7 दिनों से अधिक पुरानी पंक्तियों को स्वचालित रूप से हटा देती है

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

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

ओह, इवेंट शेड्यूलर चालू नहीं है। कुछ भी ट्रिगर नहीं होगा।

SET GLOBAL event_scheduler = ON; -- turn her on and confirm below

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

परीक्षण के लिए स्कीमा

create table theMessages
(   id int auto_increment primary key,
    userId int not null,
    message varchar(255) not null,
    updateDt datetime not null,
    key(updateDt)
    -- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');

2 इवेंट बनाएं, पहला रन प्रतिदिन, दूसरा रन हर 10 मिनट में

इस बात पर ध्यान न दें कि वे वास्तव में क्या कर रहे हैं (एक दूसरे के खिलाफ खेलना)। बिंदु time difference पर है दृष्टिकोण और शेड्यूलिंग

DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
  ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   delete from theMessages 
   where datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
   -- etc etc all your stuff in here
END;$$
DELIMITER ;

...

DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
  ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   delete from theMessages 
   where TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)
   -- etc etc all your stuff in here
END;$$
DELIMITER ;

ईवेंट की स्थिति दिखाएं (अलग-अलग तरीके)

show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from mysql> prompt

*************************** 1. row ***************************
                  Db: so_gibberish
                Name: delete7DayOldMessages
             Definer: [email protected]
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: so_gibberish
                Name: Every_10_Minutes_Cleanup
             Definer: [email protected]
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: MINUTE
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.06 sec)

यादृच्छिक सामग्री पर विचार करें

drop event someEventName; -- <----- के बारे में जानना एक अच्छी बात है

दिनांकित को उपनाम नहीं दे सकता और जहां 1 पंक्ति में खंड का उपयोग करता है, इसलिए

select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;

अधिक सटीक प्राप्त करें, 1 सप्ताह पुराने के लिए 168 घंटे

select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
|  1 |        410 |
|  2 |        301 |
|  3 |        169 |
|  4 |        167 |
+----+------------+

मैनुअल पेज का लिंक नीचे दिखाए गए अंतराल विकल्पों के साथ काफी लचीलापन दिखाता है:

<ब्लॉकक्वॉट>

अंतराल:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

समरूपता

कोई भी समवर्ती उपाय एम्बेड करें जो आवश्यक हो कि एकाधिक ईवेंट (या एक ही ईवेंट की एकाधिक फायरिंग) के कारण डेटा आपस में न चले।

सेट करें और भूल जाएं

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

आपकी विशेष आवश्यकताएं

आपको यह निर्धारित करने की आवश्यकता है कि कौन सी पंक्तियों को पहले तालिका द्वारा हटाया जाना चाहिए, जैसे कि यह प्राथमिक कुंजी बाधाओं का सम्मान करता है। क्रिएट इवेंट स्टेटमेंट के माध्यम से स्पष्ट क्षेत्र के अंदर उन सभी को उचित क्रम में डालें, जो बहुत बड़ा हो सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql पंक्ति को स्तंभ में और स्तंभ को पंक्ति में स्थानांतरित करता है

  2. MySQL दिनांक प्रारूप

  3. 'mysqldump' का उपयोग करके CSV प्रारूप में सभी तालिकाओं को डंप करें

  4. Amazon Aurora Serverless के साथ स्वचालित स्केलिंग

  5. MySQL:लेनदेन बनाम लॉकिंग टेबल्स