যখন কোনও মাইএসকিউএল টেবিলটি সর্বশেষ আপডেট হয়েছিল তখন আমি কীভাবে বলতে পারি?


176

আমার পৃষ্ঠার পাদলেখগুলিতে, আমি এই তারিখটির সাথে একটি নির্দিষ্ট মাইএসকিউএল টেবিলটি সর্বশেষ আপডেট হওয়ার পরে সর্বশেষে "সর্বশেষ আপডেট হওয়া xx / xx / 200x" এর মতো কিছু যুক্ত করতে চাই।

এটি করার সর্বোত্তম উপায় কী? শেষ আপডেট হওয়া তারিখটি পুনরুদ্ধার করার জন্য কোনও ফাংশন রয়েছে? প্রতিবার যখন আমার এই মানটি প্রয়োজন তখন আমার কি ডাটাবেসে অ্যাক্সেস করা উচিত?


উত্তর:


276

মাইএসকিউএলের পরবর্তী সংস্করণগুলিতে information_schemaআপনি যখন অন্য টেবিলটি আপডেট হয়েছিল তখন আপনাকে ডেটাবেস ব্যবহার করতে পারেন :

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'

এটি অবশ্যই ডাটাবেসের সাথে একটি সংযোগ খোলার অর্থ নয়।


যখনই মাইএসকিউএল টেবিলটি আপডেট করা হয় তখন একটি বিকল্প বিকল্প কোনও নির্দিষ্ট ফাইলটিকে "স্পর্শ" করা:

ডাটাবেস আপডেটে:

  • O_RDRWমোডে আপনার টাইমস্ট্যাম্প ফাইলটি খুলুন
  • close এটা আবার

বা বিকল্পভাবে

  • ফাইল টাইমস্ট্যাম্প পরিবর্তন করতে, ফাংশনের touch()পিএইচপি সমতুল্য ব্যবহার utimes()করুন।

পৃষ্ঠা প্রদর্শনে:

  • stat()ফাইল পরিবর্তন সময় ফিরে পড়তে ব্যবহার করুন।

9
InnoDB সীমাবদ্ধতা সহ বিশদগুলির জন্য দেখুন dev.mysql.com/doc/refman/5.5/en/show-table-status.html ( show table statusব্যবহার information_schema.tables)
কেসিডি

11
নীচের UPDATE_TIMEপদ্ধতি এবং পদ্ধতি উভয়ই show table statusইনোডিবি নয়, কেবল মাইআইএসএএম ইঞ্জিনের সাথে উপলব্ধ। যদিও এটি একটি বাগ হিসাবে তালিকাভুক্ত করা হয়েছে, এটি মাইএসকিউএল 5.5 রেফারেন্সে উল্লেখ করা হয়েছে , যা আরও বলে যে file_per_tableমোডটি সংশোধন সময়ের একটি অবিশ্বাস্য সূচক।
idoimacing


7
মাইএসকিউএল ৫.7.২+ এর জন্য এটি ইনোডিবি-র জন্যও কাজ করে : "মাইএসকিউএল ৫.7.২ থেকে শুরু করে, ইউপিডিএলটিটাইম সর্বশেষ আপডেটের জন্য একটি টাইমস্ট্যাম্প মান প্রদর্শন করে, INSERT, বা DELETE পার্টিশনবিহীন নয় এমন InnoDB টেবিলগুলিতে সঞ্চালিত হয় Previous InnoDB টেবিলের জন্য। "
পিটার ভি।

2
এটি আমার জন্য পুনরায় চালু করার বিষয়ে মনে হয় না (সংস্করণ 5.7.11)।

58

MySQL সংস্করণ 4.1.16 ব্যবহার করে আমার কাছে তথ্য_স্কেমা ডাটাবেস নেই, সুতরাং এক্ষেত্রে আপনি এটি জিজ্ঞাসা করতে পারেন:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

এটি এই কলামগুলি ফিরিয়ে দেবে:

| নাম | ইঞ্জিন | সংস্করণ | সারি_ফর্ম্যাট | সারি | গড়_রো_ দৈর্ঘ্য 
| ডাটা_ দৈর্ঘ্য | সর্বোচ্চ_ডাটা_ দৈর্ঘ্য | সূচি_ দৈর্ঘ্য | ডেটা_ফ্রি | স্বতঃআগ্রহ
| তৈরি_কাল | আপডেট_টাইম | চেক_টাইম | কোলেশন
| চেকসাম | ক্রিয়েট_পশন | মন্তব্য |

আপনি দেখতে পাচ্ছেন এখানে একটি কলাম আছে: " আপডেট_টাইম " যা আপনাকে আপনার_সামগ্রহের জন্য শেষ আপডেটের সময় দেখায় ।


2
এটি দ্রুত সঞ্চালন করে (4x) তারপরে নির্বাচন করুন বিবৃতি
jmav

1
প্রকৃতপক্ষে, এর মতো বেশিরভাগ শো কমান্ডগুলি কেবল অভ্যন্তরীণভাবে ইনফরমেশন_স্কেমার ক্যোয়ারিতে ম্যাপ করা হয়, সুতরাং এই উত্তরটি উপরে আলনিটাকের উত্তর হিসাবে ঠিক একই ডেটা দেয়। এবং অজাসিয়ান 81 সঠিক - এটি মাইএসকিউএল এর ডিফল্ট স্টোরেজ ইঞ্জিন, ইনোডিবি-তে কাজ করে না।
বিল কারভিন

55

আমি অবাক হয়েছি যে প্রতি সারিতে সর্বশেষ আপডেটের সময় ট্র্যাক করার পরামর্শ কেউ দেয়নি:

mysql> CREATE TABLE foo (
  id INT PRIMARY KEY
  x INT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
                     ON UPDATE CURRENT_TIMESTAMP,
  KEY (updated_at)
);

mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | NULL | 2013-08-18 03:26:28 |
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

mysql> UPDATE foo SET x = 1234 WHERE id = 1;

আমরা আপডেটে এটি উল্লেখ না করেও এটি টাইমস্ট্যাম্প আপডেট করে।

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

এখন আপনি MAX () এর জন্য জিজ্ঞাসা করতে পারেন:

mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at)     |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+

স্বীকার করা হয়েছে, এর জন্য আরও স্টোরেজ প্রয়োজন (TIMESTAMP এর জন্য প্রতি সারিতে 4 বাইট)।
তবে এটি মাইএসকিউএলের 5.7.15 সংস্করণের আগে ইনোডিবি টেবিলগুলির জন্য কাজINFORMATION_SCHEMA.TABLES.UPDATE_TIME করে , যা না।


10
+1 যতটা আমি উদ্বিগ্ন, এটি এই প্রশ্নের একমাত্র সঠিক উত্তর। প্রশ্নটি কখন প্রাসঙ্গিক ডেটা আপডেট হয় তা জানতে চায় এবং যখন কোনও টেবিল (যা ব্যবহারকারীর কাছে অপ্রাসঙ্গিক) তখন যে কোনও কারণে পরিবর্তন করা যেতে পারে বা নাও হতে পারে।
স্যারাইড

23
আপনি যদি কম আপডেটের সময় দিয়ে কোনও রেকর্ড মুছে ফেলেন তবে ম্যাক্স (আপডেটড্যাট) কাজ করবে না।
আম্মোমন

3
আম্মান, সত্য, যদি আপনারও মুছে ফেলার জন্য অ্যাকাউন্ট দরকার হয় তবে এই সমাধানটি এটি প্রতিফলিত করে না। সংক্ষিপ্ত টেবিল আপডেট করার জন্য একটি ট্রিগার একমাত্র বিস্তৃত সমাধান হতে পারে, তবে এটি একটি বাধা তৈরি করবে।
বিল কারভিন

2
বেশিরভাগ ক্ষেত্রে মুছে ফেলা জেনে যাওয়া প্রাসঙ্গিক হবে না এবং অনেকগুলি উচ্চ স্তরের অ্যাপস সত্যিকার অর্থে অনেকগুলি টেবিল থেকে মুছবে না তবে কেবল সমমানের জন্য একটি পতাকা আনসেট করবে।
স্যামুয়েল ফুলম্যান

1
@ পাভান, কোনও পার্থক্য নেই, আপনি কেবলমাত্র পূর্বনির্ধারিত আচরণের উপর নির্ভর করছেন এবং আমার উদাহরণটি স্পষ্টভাবে বিকল্পটি বানান। তবে বিকল্পটি ডিফল্ট আচরণের মতো।
বিল কারভিন

13

সবচেয়ে সহজ জিনিসটি হ'ল ডিস্কে থাকা টেবিল ফাইলগুলির টাইমস্ট্যাম্প পরীক্ষা করা। উদাহরণস্বরূপ, আপনি আপনার ডেটা ডিরেক্টরিতে চেক করতে পারেন

cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd

এটি সর্বপ্রথম প্রাচীনতম বার সংশোধন করার পরে আপনাকে সারণীর সাথে সমস্ত সারণীর তালিকা দেওয়া উচিত।


সত্যিই দুর্দান্ত উত্তর যেহেতু UPDATE_TIME হ'ল আমার (মারিয়াডিবি) মামলার সমস্ত টেবিলের জন্য নাল
আলেকজান্ডার

আইবিডি ফাইলগুলি কেবল টেবিলের কাঠামো সংরক্ষণ করে। ডিফল্টরূপে, ডেটা আইবডাটা 1 এ সংরক্ষণ করা হয় সুতরাং টেবিলে ডেটা পরিবর্তন করা হলে আইবিড ফাইল টাইমস্ট্যাম্প আপডেট হবে না। https://dev.mysql.com/doc/refman/8.0/en/show-table-status.html
স্ট্যাক আন্ডারফ্লো

7

সাম্প্রতিক টেবিল পরিবর্তনের তালিকার জন্য এটি ব্যবহার করুন:

SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME

3
আমার UPDATE_TIMEসব নাল কেন ? কোন ধারণা?
মেটাফানিয়েল

5
আপনার UPDATE_TIME নাল কারণ আপনি মাইআইএসএএম এর পরিবর্তে ইনোডিবি ব্যবহার করছেন। InnoDB সাধারণত ভাল পছন্দ, তবে এটি UPDATE_TIME সমর্থন করে না।
জারাক্সিয়া

5

আমি একটি ট্রিগার তৈরি করব যা সমস্ত আপডেট / সন্নিবেশ / মোছা এবং কাস্টম টেবিলের টাইমস্ট্যাম্প লিখবে, টেবিলের মতো কিছু | টাইমস্ট্যাম্প

কেবলমাত্র ডিবি সার্ভারের অভ্যন্তরীণ সিস্টেমের টেবিলগুলি সরাসরি পড়ার ধারণাটি আমার পছন্দ নয়


1
এটি এমএস এসকিউএল এর পক্ষে একটি ভাল সমাধান বলে মনে হচ্ছে, কারণ UPDATE_TIMEমাইএসকিউএল এর মতো কোনও কলাম নেই ।
ডারসি

3

যদিও এখানে একটি স্বীকৃত উত্তর রয়েছে তবে আমি অনুভব করি না যে এটি সঠিক। এটি যা প্রয়োজন তা অর্জন করার সহজতম উপায়, তবে ইতিমধ্যে InnoDB- তে সক্ষম থাকলেও (প্রকৃতপক্ষে ডক্স আপনাকে জানায় যে আপনাকে এখনও NULL পাওয়া উচিত ...), যদি আপনি মাইএসকিউএল ডক্সগুলি পড়েন , এমনকি ইউপিডিটিফলটাইম ব্যবহার করে বর্তমান সংস্করণে (8.0) হ'ল সঠিক বিকল্প নয়, কারণ:

যখন সার্ভারটি পুনরায় চালু হবে বা যখন টেবিলটি InnoDB ডেটা অভিধান ক্যাশে থেকে উচ্ছেদ করা হবে তখন টাইমস্ট্যাম্পগুলি স্থির থাকে না।

যদি আমি সঠিকভাবে বুঝতে পারি (এখনই এটি কোনও সার্ভারে যাচাই করতে পারে না), টাইমস্ট্যাম্প সার্ভার পুনরায় চালু হওয়ার পরে পুনরায় সেট হয়ে যায়।

আসল (এবং, ভাল, ব্যয়বহুল) সমাধানগুলির জন্য, আপনার কাছে CURRENT_TIMESTAMP এর সাথে বিল কার্বিনের সমাধান রয়েছে এবং আমি একটি ভিন্ন প্রস্তাব করতে চাই, এটি ট্রিগারগুলির উপর ভিত্তি করে (আমি এটি ব্যবহার করছি)।

আপনি একটি পৃথক টেবিল তৈরি করে শুরু করেন (বা সম্ভবত আপনার কাছে অন্য কোনও টেবিল রয়েছে যা এই উদ্দেশ্যে ব্যবহার করা যেতে পারে) যা বিশ্বব্যাপী ভেরিয়েবলগুলির জন্য স্টোরেজের মতো কাজ করবে (এখানে টাইমস্ট্যাম্পস)। আপনাকে দুটি ক্ষেত্র সংরক্ষণ করতে হবে - টেবিলের নাম (বা যে মানটি আপনি এখানে টেবিল আইডি হিসাবে রাখতে চান) এবং টাইমস্ট্যাম্প। আপনার কাছে এটি পাওয়ার পরে, আপনি এই টেবিল আইডি + শুরুর তারিখ (এখনই) একটি ভাল পছন্দ :)) দিয়ে এটি শুরু করতে হবে।

এখন, আপনি যে টেবিলগুলিতে পর্যবেক্ষণ করতে চান এবং সারণি / আপডেট / পরে এই বা অনুরূপ পদ্ধতিটি মুছে ফেলুন সেগুলি যোগ করতে চান:

CREATE PROCEDURE `timestamp_update` ()
BEGIN
    UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
    SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
    WHERE `table_name_column`='TABLE_NAME';
END

1

ওএস স্তর বিশ্লেষণ:

ডিসিতে ডিবি কোথায় রয়েছে তা সন্ধান করুন:

grep datadir /etc/my.cnf
datadir=/var/lib/mysql

সাম্প্রতিকতম পরিবর্তনগুলির জন্য পরীক্ষা করুন Check

cd /var/lib/mysql/{db_name}
ls -lrt

সমস্ত ডাটাবেস ধরণের উপর কাজ করা উচিত।


0

কেবল ফাইল সিস্টেম থেকে পরিবর্তিত ফাইলের তারিখটি ধরুন। আমার ভাষায় তা হ'ল:

 tbl_updated = file.update_time(
        "C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm")

আউটপুট:

1/25/2013 06:04:10 AM

6
অত্যন্ত নন পোর্টেবল হ্যাকের মতো দেখায়, একটি স্ট্যান্ডার্ড উপায় যা সর্বত্র কাজ করবে ভাল হবে
তেজেশ আলিমিলি

0

আপনি যদি লিনাক্স চালাচ্ছেন তবে আপনি টেবিল বা ডাটাবেস ডিরেক্টরিটি দেখার জন্য ইনোটিফাই ব্যবহার করতে পারেন। inotify পিএইচপি, নোড.জেএস, পার্ল থেকে পাওয়া যায় এবং আমি বেশিরভাগ অন্যান্য ভাষায় সন্দেহ করি। অবশ্যই আপনি অবশ্যই ইনোটিফাই ইনস্টল করেছেন বা আপনার আইএসপি এটি ইনস্টল করেছেন। অনেকটা আইএসপি করবে না।


2
আপনার ডাটাবেসটি একটি পৃথক সার্ভারে চলমান থাকলে ফাইল সিস্টেম চেকগুলি কার্যকর হয় না
স্যাম ডুফেল

0

এটি কোনও আগ্রহের বিষয় কিনা তা নিশ্চিত নয়। মাইএসকিএল এবং ক্লায়েন্টদের মধ্যে মাইএসকিপ্লোক্সি ব্যবহার করে এবং আকর্ষণীয় টেবিল পরিবর্তন অনুসারে ম্যাকচেডে একটি মূল মান আপডেট করার জন্য লুয়া স্ক্রিপ্ট ব্যবহার করে আপডেট করা, মুছে ফেলা, INSERT ছিল সমাধানটি যা আমি সম্প্রতি করেছি। যদি মোড়কগুলি হুক সমর্থন করে বা পিএইচপি এ ট্রিগার করে, তবে এটি ইজার হতে পারে। এখন পর্যন্ত মোড়কের মধ্যে কেউই এটি করে না।


0

আমি নামে একটি কলাম তৈরি করেছি: পিএইচপিএমইএডমিনে আপডেট-এ এবং আমার কোডে নোডেজ (তারিখ) পদ্ধতি থেকে বর্তমান সময়টি পেয়েছে। টেবিলের প্রতিটি পরিবর্তনের সাথে এই কলামটি পরিবর্তনের সময়টি ধরে রাখে।


1
স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! আপনি যে কোডটি ব্যবহার করেছেন তার কিছু অন্তর্ভুক্ত করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন , পাশাপাশি আপনি কেন এইভাবে এটি বেছে নিলেন তার একটি ব্যাখ্যাও । এই প্রশ্নটি প্রায় এগারো বছরের পুরানো এবং ইতিমধ্যে একটি স্বীকৃত, ভাল-উত্তোলিত উত্তর রয়েছে। আপনার উত্তর, কোনও কোড বা ব্যাখ্যা ছাড়াই, সম্ভবত ডাউনভোট বা মুছে ফেলা হবে। এই জিনিসগুলি অন্তর্ভুক্ত করার জন্য এটি সম্পাদনা করা এই পোস্টে এর স্থানটি ন্যায়সঙ্গত করতে সহায়তা করবে।
দাস_গীক

0

ক) এটি আপনাকে সমস্ত সারণী এবং সেখানে সর্বশেষ আপডেটের তারিখ প্রদর্শন করবে

SHOW TABLE STATUS FROM db_name;

তারপরে, আপনি আরও নির্দিষ্ট সারণির জন্য জিজ্ঞাসা করতে পারেন:

SHOW TABLE STATUS FROM db_name like 'table_name';

খ) উপরের উদাহরণগুলির মতো আপনি 'আপডেট_টাইম'-এ বাছাই করতে পারবেন না তবে বেছে বেছে বেছে বেছে ব্যবহার করতে পারেন:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' ORDER BY UPDATE_TIME DESC;

আরও নির্দিষ্ট টেবিল সম্পর্কে জিজ্ঞাসা:

SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' AND table_name='table_name' ORDER BY UPDATE_TIME DESC';

-1

এটিই আমি করেছি, আশা করি এটি সাহায্য করবে।

<?php
    mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
    mysql_select_db("information_schema") or die(mysql_error());
    $query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE
        `TABLE_SCHEMA` LIKE 'DataBaseName' AND `TABLE_NAME` LIKE 'TableName'";
    $result1 = mysql_query($query1) or die(mysql_error());
    while($row = mysql_fetch_array($result1)) {
        echo "<strong>1r tr.: </strong>".$row['UPDATE_TIME'];
    }
?>

2
আপনি এখানে কেন পছন্দ করবেন?
কাইল বুজার

3
@ ওয়েজলিমার্চ: <ফন্ট> ট্যাগটি হ্রাস করা হয়েছে।
স্যারাইড

-9

বিশ্বব্যাপী ভেরিয়েবলে ক্যোরিটি ক্যাশ করুন যখন এটি উপলব্ধ না থাকে।

ক্যাশেটি আপডেট করার পরে পুনরায় লোড করতে বাধ্য করার জন্য একটি ওয়েবপৃষ্ঠা তৈরি করুন Create

আপনার স্থাপনার স্ক্রিপ্টগুলিতে পুনরায় লোডিং পৃষ্ঠায় একটি কল যুক্ত করুন।


2
আপনি বাইরের সহায়তা ছাড়াই পিএইচপি পৃষ্ঠার স্বতন্ত্র আহ্বানের মধ্যে পরিবর্তনগুলি "ক্যাশে" করতে পারবেন না।
Alnitak
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.