মাইএসকিউএল এ কার্যকর করা শেষ প্রশ্নগুলি কীভাবে দেখাব?


471

সমস্ত সার্ভারে শেষ হওয়া ক্যোয়ারীগুলি দেখানোর কোনও প্রশ্ন / উপায় আছে ?

উত্তর:


793

মাইএসকিউএল> = 5.1.12 দিয়ে আশীর্বাদ প্রাপ্তদের জন্য, আপনি রানটাইমে বিশ্বব্যাপী এই বিকল্পটি নিয়ন্ত্রণ করতে পারেন:

  1. এক্সিকিউট SET GLOBAL log_output = 'TABLE';
  2. এক্সিকিউট SET GLOBAL general_log = 'ON';
  3. টেবিলটি একবার দেখুন mysql.general_log

আপনি যদি টেবিলের পরিবর্তে কোনও ফাইলে আউটপুট দিতে পছন্দ করেন:

  1. SET GLOBAL log_output = "FILE"; ডিফল্ট
  2. SET GLOBAL general_log_file = "/path/to/your/logfile.log";
  3. SET GLOBAL general_log = 'ON';

আমি এই পদ্ধতিটি .cnf ফাইল সম্পাদনা করার চেয়ে পছন্দ করি কারণ:

  1. আপনি my.cnfফাইলটি সম্পাদনা করছেন না এবং সম্ভাব্য স্থায়ীভাবে লগিং চালু করছেন
  2. আপনি কোয়েরি লগের জন্য বা ফাইল-সিস্টেমের চারপাশে মাছ ধরছেন না - বা আরও খারাপ, নিখুঁত গন্তব্যের প্রয়োজনে বিক্ষিপ্ত। /var/log /var/data/log /opt /home/mysql_savior/var
  3. আপনাকে সার্ভারটি পুনরায় আরম্ভ করতে হবে না এবং এতে কোনও বর্তমান সংযোগ বিঘ্নিত করতে হবে না।
  4. সার্ভারটি পুনরায় আরম্ভ করার ফলে আপনি যেখানে শুরু করেছেন সেখানেই (লগটি ডিফল্টরূপে এখনও বন্ধ রয়েছে)

আরও তথ্যের জন্য মাইএসকিউএল 5.1 রেফারেন্স ম্যানুয়াল - সার্ভার সিস্টেম ভেরিয়েবলস - জেনারেল_লগ দেখুন


4
গ্রেট ইউআই ডিজাইন। যাইহোক, মাইএসকিউএল লগ টেবিলগুলি আসলে সিএসভি ইঞ্জিন ব্যবহার করছে যাতে আপনি ফ্লিপএমসিএফ জেনার_লগ টেবিলটিতে লগিং সক্ষম করার বিষয়ে উত্তরে যা যা বলেছিলেন তা করতে পারেন, এবং জেনারেল-লগের লেজ -f এর মতো থাকে: লেজ -f / var / lib / mysql / mysql / general_log.CSV

2
এটি হতাশ, এর জন্য মাইএসকিএল ডক এমনকি টেবিলের প্যারামিটারটিকেও গুলি করে না। অনেক ধন্যবাদ.
অভিষেক দুজারি


6
আপনার কাজ শেষ হয়ে গেলে আপনার সাধারণ লগ টেবিলটি পরিষ্কার করতে ভুলবেন না: "ছাঁটাই টেবিল mysql.general_log"
pdwalker

1
আমি ফলাফলটি এইভাবে পেয়েছি, তবে প্যারামিটারগুলি প্রশ্ন চিহ্ন দ্বারা উপস্থিত রয়েছে, উদাহরণস্বরূপ, বার থেকে foo নির্বাচন করুন যেখানে x = ?. আমি কীভাবে সম্পূর্ণ জিজ্ঞাসা পেতে পারি?
52-

43

আপনি এই ধরণের ডায়াগনস্টিকের জন্য একটি সাধারণ ক্যোয়ারী লগ সক্ষম করতে পারেন । সাধারণত আপনি কোনও প্রোডাকশন সার্ভারে সমস্ত নির্বাচন প্রশ্নগুলি লগ করেন না, এটি একটি পারফরম্যান্স হত্যাকারী।

আপনার মাইএসকিউএল কনফিগারেশন সম্পাদনা করুন, যেমন /etc/mysql/my.cnf - এর মতো একটি লাইন অনুসন্ধান করুন বা যুক্ত করুন

[mysqld]
log = /var/log/mysql/mysql.log

এই পরিবর্তনটি চয়ন করতে mysql পুনরায় আরম্ভ করুন, এখন আপনি পারেন

tail -f /var/log/mysql/mysql.log

আরে প্রেস্টো, প্রশ্নগুলি তারা আসার সাথে সাথে দেখতে পারেন।


4
আমার_আরসিএনএফ-এ জেনারেল_লগ_ফাইল এবং জেনারেল_লগ
মার্টিন থোমা

আপনি যদি পুনরায় আরম্ভ করা জানতে চান তবে এটি কাজ করছে জিজ্ঞাসা জিজ্ঞাসা
কুমার

1
ম্যাক ওএস এক্স (কমপক্ষে ম্যাক ওএস এক্সে) এর নতুন সংস্করণগুলিতে কেবল "লগ =" পরিবর্তে জেনারেল-লগ_ফায়াল এবং জেনারেল-লগ বিকল্পের প্রয়োজন। অন্যথায়, আপনি এর মতো একটি ত্রুটি পান: এআরআরআর / ইউএসআর / লোকাল / মাইএসকিএল / বিন / মাইএসকিএলডি: দ্বিধাবিভক্ত বিকল্প '--log = / tmp / mysql_queries.log' (লগ-বিন, লগ_স্ল্যাভ_আপেটস)
জে শেঠ

@ জায়েশেথ, আমি মারিয়াদব ১০.২ এ ত্রুটি পেয়েছি, সুতরাং আমি নিশ্চিত নই যে এটি কেবল ম্যাক ওএসের সাথে সম্পর্কিত।
ব্যবহারকারী 10089632

16

আপনি mysql ক্যোয়ারী লগগুলি নিরীক্ষণের জন্য প্রবাহিত কাজটি করতে পারেন।

মাইকিকিএল কনফিগারেশন ফাইলটি My.cnf খুলুন

sudo nano /etc/mysql/my.cnf

[mysqld]লগ সক্ষম করতে এই শিরোনামের নীচে নিম্নলিখিত লাইনগুলি অনুসন্ধান করুন এবং এই লাইনগুলিকে কোনও অসুবিধে করুন

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

পরিবর্তনগুলি প্রতিবিম্বিত করার জন্য আপনার মাইএসকিএল সার্ভারটি পুনরায় চালু করুন

sudo service mysql start

টার্মিনালে নিম্নলিখিত কমান্ড সহ mysql সার্ভার লগ নিরীক্ষণ

tail -f /var/log/mysql/mysql.log


9

1) সাধারণ মাইএসকিএল লগিং সক্ষম করা থাকে তবে আমরা কনফিগারেশনে উল্লিখিত লগ ফাইল বা টেবিলের ভিত্তিতে প্রশ্নগুলি পরীক্ষা করতে পারি। নিম্নলিখিত কমান্ডটি দিয়ে কী সক্ষম হয়েছে তা পরীক্ষা করুন

mysql> show variables like 'general_log%';
mysql> show variables like 'log_output%';

আমাদের যদি টেবিলে কোয়েরির ইতিহাসের প্রয়োজন হয়

Execute SET GLOBAL log_output = 'TABLE';
Execute SET GLOBAL general_log = 'ON';

টেবিলটি একবার দেখুন mysql.general_log

আপনি যদি কোনও ফাইলে আউটপুট দিতে পছন্দ করেন:

SET GLOBAL log_output = "FILE"; which is set by default.
SET GLOBAL general_log_file = "/path/to/your/logfile.log";
SET GLOBAL general_log = 'ON';

2) আমরা .mysql_history ফাইল বিড়াল the / .mysql_history এও প্রশ্নগুলি পরীক্ষা করতে পারি



4

যদি মাইএসকিএল বিনলগ সক্ষম হয় আপনি লিনাক্স কনসোলে মাইএসকিএল বিনলগ ডিরেক্টরিতে ব্রাউজ করে নিম্নলিখিত কমান্ড প্রয়োগ করে ব্যবহারকারী দ্বারা পরিচালিত কমান্ডগুলি পরীক্ষা করতে পারবেন

mysqlbinlog binlog.000001 >  /tmp/statements.sql

সক্রিয়

[mysqld]
log = /var/log/mysql/mysql.log

বা সাধারণ লগের প্রভাব মাইএসকিএল সম্পাদন করে


সম্ভব, কিন্তু বেদনাদায়ক অতীতে কী ঘটেছিল তা যদি আপনি সন্ধান করে থাকেন তবে আরও দরকারী।
pdwalker

2

আপনি যদি নিজের মাইএসকিউএল কনফিগারেশন পরিবর্তন করতে চান না তবে আপনি "নিউর প্রোফাইল এসকিউএল" http://www.profilesql.com এর মতো এসকিউএল প্রোফাইলার ব্যবহার করতে পারেন ।


2

পলের উত্তর পড়ার পরে, আমি https://dev.mysql.com/doc/refman/5.7/en/query-log.html আরও তথ্যের জন্য খনন করতে গিয়েছিলাম

আমি একজন ব্যক্তির দ্বারা সত্যই দরকারী কোড খুঁজে পেয়েছি। এখানে প্রসঙ্গে সংক্ষিপ্তসার।

(দ্রষ্টব্য: নিম্নলিখিত কোডটি আমার নয়)

এই স্ক্রিপ্টটি টেবিলটি পরিষ্কার রাখার একটি উদাহরণ যা আপনাকে আপনার টেবিলের আকার হ্রাস করতে সহায়তা করবে। এক দিনের পরে, লগ সম্পর্কে প্রায় 180k ক্যোয়ারী থাকবে। (কোনও ফাইলে এটি প্রতিদিন 30MB হবে)

আপনাকে একটি অতিরিক্ত কলাম যুক্ত করতে হবে (ইভেন্ট_উনিক্স) এবং তারপরে আপনি লগটি পরিষ্কার রাখতে এই স্ক্রিপ্টটি ব্যবহার করতে পারেন ... এটি টাইমস্ট্যাম্পটিকে ইউনিক্স-টাইমস্ট্যাম্পে আপডেট করবে, 1 দিনের বেশি লগগুলি মুছে ফেলবে এবং তারপরে ইভেন্ট_টাইমকে টাইমস্ট্যাম্পে আপডেট করবে ইভেন্ট_ ইউনিক্স থেকে ... কিছুটা বিভ্রান্ত লাগছে, তবে এটি দুর্দান্ত কাজ করছে।

নতুন কলামের জন্য আদেশগুলি:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
ALTER TABLE `general_log_temp`
ADD COLUMN `event_unix` int(10) NOT NULL AFTER `event_time`;
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

ক্লিনআপ স্ক্রিপ্ট:

SET GLOBAL general_log = 'OFF';
RENAME TABLE general_log TO general_log_temp;
UPDATE general_log_temp SET event_unix = UNIX_TIMESTAMP(event_time);
DELETE FROM `general_log_temp` WHERE `event_unix` < UNIX_TIMESTAMP(NOW()) - 86400;
UPDATE general_log_temp SET event_time = FROM_UNIXTIME(event_unix);
RENAME TABLE general_log_temp TO general_log;
SET GLOBAL general_log = 'ON';

ক্রেডিট সেবাস্তিয়ান কায়সারকে (কোডটির মূল লেখক)।

আশা করি কেউ আমার মতো করে কাজে লাগবে।


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

1

আপনি লিনাক্সে নিম্নলিখিতটি দেখতে পারেন

cd /root

ls -al

vi .mysql_history এটি সাহায্য করতে পারে


6
দেখে মনে হচ্ছে এটি কেবলমাত্র অফিসিয়াল কমান্ড-লাইন মাইএসকিএল ক্লায়েন্টের জন্য কাজ করবে, এবং শুধুমাত্র মূল ব্যবহারকারী দ্বারা সম্পাদিত প্রশ্নের জন্য
golimar

প্রশ্ন বলছে 'সমস্ত সার্ভার' যা এই উত্তরটিকে ভুল করে। এটি একক ক্লায়েন্ট দ্বারা সম্পাদিত সমস্ত প্রশ্নগুলি দেখায়।
ফ্লিপএমসিএফ

যদি মাইএসকিএল বিনলগ সক্ষম হয় আপনি লিনাক্স কনসোলে নিম্নলিখিত কমান্ডটি ব্যবহার করে মাইএসকিএল বিনলগ ডিরেক্টরিটি mysqlbinlog বিনলগ.000001> /tmp/statements.sql সক্ষম করে [mysqld] লগ = / var / লগ / mysql / ব্যবহার করে ব্যবহারকারী দ্বারা চালিত কমান্ডগুলি পরীক্ষা করতে পারবেন মাইএসকিএল.লগ বা জেনারাল লগের প্রভাব মাইএসকিএল-এর অভিনয়তে হবে
অবিনাশ সিং ২

এর মধ্যে কিছু এন্ট্রিগুলি যে কোনও উপায়ে ডিফল্টরূপে দমন করা হয়, উদাহরণস্বরূপ "পাসওয়ার্ড" যুক্ত স্ট্রিংগুলি।
mckenzm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.