খালি টেবিলগুলি কীভাবে ফেলবেন


11

আমার বিশাল ডাটাবেস (মাইএসকিএল) থেকে সমস্ত খালি টেবিলগুলি ফেলে দেওয়া কি সম্ভব?

এই সমস্ত খালি টেবিলগুলি স্বয়ংক্রিয়ভাবে অপসারণের জন্য আমি একটি স্কিএল কমান্ডের সন্ধান করছি।

বর্তমানে আমার ডেটাসেটে আমার 305 টি টেবিল রয়েছে এবং এর মধ্যে প্রায় 30% পুরানো খালি টেবিল রয়েছে যা আমার নতুন অ্যাপ্লিকেশনটিতে ব্যবহৃত হবে না।

শুধু নির্মল; সমস্ত সারণী = মাইআইএসএএম প্রকারের


1
সমস্ত টেবিলগুলি মাইআইএসএএম, ইনোডিবি, বা উভয়ের মিশ্রণ ???
রোল্যান্ডোমাইএসকিউএলডিবিএ

তারা সকলেই মাইআইএসএএম
যোগ্যতা

উত্তর:


11

ধারণাটি সম্ভবত খালি টেবিলগুলি ব্যবহার করে সন্ধান করা হবে INFORMATION_SCHEMA.TABLES

SELECT * 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_ROWS =  '0'
AND TABLE_SCHEMA = 'my_database_only'

তারপরে আপনি এর সাথে একটি এসকিউএল কোয়েরি তৈরি করতে সক্ষম হতে পারেন

SELECT CONCAT('DROP TABLE ', GROUP_CONCAT(table_name), ';') AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_ROWS = '0'
AND TABLE_SCHEMA = 'my_database_only';

দ্রুত এবং কিছুটা নোংরা, তবে আসলে কাজ করা উচিত।


3
... এবং তারপরে আপনার একটি ভাঙা ডাটাবেস সার্ভার রয়েছে কারণ আপনি কিছু সম্ভবত মাইএসকিএল সিস্টেমের টেবিলগুলি "সম্ভবত" মুছে ফেলেছেন ... এছাড়াও আপনার কনক্যাটটি স্কিমা উল্লেখ ছাড়াই একটি টেবিলের তালিকা তৈরি করে।
ক্রিশ্চিয়ান পোর্টা

1
আপনার টেবিলগুলিতে ডেটাবেস সীমাবদ্ধতার সাথে স্মার্টভাবে যুক্ত করার আপনারও "অধিকার" রয়েছে, আমি ভেবেছিলাম এটি সুস্পষ্ট।
টম ডেস্প

3
উত্তরটি গ্রাহ্য হিসাবে গ্রহণ করা উচিত নয় কারণ উত্তরটি ব্যবহারকারীর পক্ষে সম্ভাব্য বিপজ্জনক ... এগুলি সব
ক্রিশ্চিয়ান পোর্টা

2
একক ড্রপ টেবিল কমান্ড সেট আপ করার জন্য +1।
রোল্যান্ডোমাইএসকিউএলডিবিএ

1
@ সিসিপি: ঠিক আছে আমি পেয়েছি, আমার ভয়াবহ ভুল, সে কারণেই আমি উত্তরটি সম্পাদনা করেছি। যাইহোক, আমি কিছুটা আশ্চর্য হয়েছি একটি এসকিউএল ক্যোয়ারী আসলে কোনও মাইএসকিউএল সিস্টেমের অভ্যন্তরীণ টেবিলটি ফেলে দিতে পারে। আমার দৃষ্টিকোণ থেকে, এটি সম্পূর্ণরূপে ভাঙা।
টম ডেস্প

7

যেহেতু সমস্ত টেবিলগুলি মাইআইএসএএম, এটি আমার উত্তরটি প্রকাশ করা সহজ করে।

প্রথমত, শূন্য সারি রয়েছে এমন টেবিলগুলির জন্য আপনাকে INFORMATION_SCHEMA টি জিজ্ঞাসা করতে হবে:

SELECT table_schema,table_name FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');

এরপরে, খালি টেবিলগুলি ফেলে দেওয়ার জন্য ক্যোয়ারী তৈরি করুন:

SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');

এখন, কমান্ডগুলি একটি বহিরাগত এসকিউএল পাঠ্য ফাইলের মধ্যে ফেলে দিন।

SQL="SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand"
SQL="${SQL} FROM information_schema.tables WHERE table_rows = 0 AND table_schema"
SQL="${SQL} NOT IN ('information_schema','mysql','performance_schema')"
mysql -uroot -p -ANe"${SQL}" > DropTables.sql

নিম্নলিখিতগুলির একটির সাথে সামগ্রীগুলি দেখুন

  • less DropTables.sql
  • cat DropTables.sql

আপনি যদি এর সামগ্রীতে সন্তুষ্ট হন তবে স্ক্রিপ্টটি চালান:

mysql -uroot -p < DropTables.sql

বা mysql এ লগইন করুন এবং এটি চালান:

mysql> source DropTables.sql

একবার চেষ্টা করে দেখো !!!

কায়েট : এই কৌশলটি কেবল মাইআইএসএএম টেবিলের সাথে কাজ করে কারণ একটি মাইস্যাম টেবিলের সারি গণনা টেবিলগুলির মধ্যে শারীরিকভাবে সঞ্চিত রয়েছে .MYD। INFORMATION_SCHEMA.TABLES মেটাডেটা টেবিলটি সর্বদা এটি পড়ে এবং আপডেট হয়। এএনএনডডব দিয়ে চেষ্টা করবেন না !!!

আপডেট 2014-02-05 11:46 EST

আমি বাদ দিয়েছি এমন একটি কারণ রয়েছে ('information_schema','mysql','performance_schema')

mysqlস্কিমা এটা খালি টেবিল হয়েছে। কিছু MyISAM, কিছু InnoDB, কিছু CSV

উদাহরণস্বরূপ, আমার ডেস্কটপে মাইএসকিউএল 5.6.15 এর জন্য মাইএসকিএল স্কিমায় আমার টেবিলগুলি এখানে রয়েছে

mysql> select table_name,engine,table_rows
    -> from information_schema.tables
    -> where table_schema='mysql';
+---------------------------+--------+------------+
| table_name                | engine | table_rows |
+---------------------------+--------+------------+
| columns_priv              | MyISAM |          0 |
| db                        | MyISAM |          2 |
| event                     | MyISAM |          0 |
| func                      | MyISAM |          0 |
| general_log               | CSV    |          2 |
| help_category             | MyISAM |         40 |
| help_keyword              | MyISAM |        485 |
| help_relation             | MyISAM |       1090 |
| help_topic                | MyISAM |        534 |
| innodb_index_stats        | InnoDB |          0 |
| innodb_table_stats        | InnoDB |          0 |
| ndb_binlog_index          | MyISAM |          0 |
| plugin                    | MyISAM |          0 |
| proc                      | MyISAM |          0 |
| procs_priv                | MyISAM |          0 |
| proxies_priv              | MyISAM |          1 |
| servers                   | MyISAM |          0 |
| slave_master_info         | InnoDB |          0 |
| slave_relay_log_info      | InnoDB |          0 |
| slave_worker_info         | InnoDB |          0 |
| slow_log                  | CSV    |          2 |
| tables_priv               | MyISAM |          0 |
| time_zone                 | MyISAM |          0 |
| time_zone_leap_second     | MyISAM |          0 |
| time_zone_name            | MyISAM |          0 |
| time_zone_transition      | MyISAM |          0 |
| time_zone_transition_type | MyISAM |          0 |
| user                      | MyISAM |          6 |
+---------------------------+--------+------------+
28 rows in set (0.01 sec)

mysql>

সেই টেবিল কিছু (যেমন অদৃশ্য হলে columns_priv, proc_priv, tables_priv, ইত্যাদি), অনুদান প্রক্রিয়া সঠিকভাবে কাজ করতে পারে বা mysqld কারণ শুরু নাও হতে পারে। আপনি মাইএসকিএল.প্রোকটিকে তত্পর করতে চান না কেননা এটি স্টোরড পদ্ধতিগুলির ফিজিকাল হোম। অন্যান্য প্রক্রিয়াগুলি যদি না হয় আপনি সেগুলি ব্যবহার করতে চান যেমন মাইএসকিএল স্কিমার অভ্যন্তরে ইনোডিবি সারণি ব্যবহার করে ক্র্যাশস্যাফ প্রতিলিপি ব্যবহার করা বা টাইমজোন তথ্য সন্নিবেশ করতে চান তবে সেগুলি কাজ করতে পারে না।

আপডেট 2014-02-05 12:36 EST

আমি নির্দিষ্ট কারণে তার উত্তরের জন্য টম ডেস্পকে প্রশংসা করতে চাই : তার বাক্য গঠনটি কোনও বাহ্যিক স্ক্রিপ্ট ব্যবহার না করেই ড্রপটি করতে পারে । তার ধারণাটি ব্যবহার করে, আমাকে একটি ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলের ড্রপ টেবিল কমান্ডটি ক্যাপচার করি।

SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(DBTB),';')
INTO @DropCommand
FROM (SELECT CONCAT(table_schema,'.',table_name) DBTB
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema')) A;
SELECT @DropCommand;

যদি আউটপুটটি SELECT @DropCommand;সঠিক হয় তবে কমান্ডটি এভাবে চালিত করুন:

PREPARE s FROM @DropCommand;
EXECUTE s;
DEALLOCATE PREPARE s;

এটি দুটি জিনিস নির্মূল করে:

  • একটি বাহ্যিক এসকিউএল পাঠ্য ফাইলের প্রয়োজন
  • প্রতিটি টেবিলের জন্য একটি পৃথক ড্রপ টেবল কমান্ড চালাচ্ছে

1
একটি দীর্ঘ এবং ভাল ব্যাখ্যা জন্য ধন্যবাদ! ডাটাবেস জুড়ে টেবিল ফেরত দেওয়ার জন্য +1। এইভাবে বেশ কয়েকটি ডেটাসেট পরিষ্কার করা সহজ। অন্য দিকে; যত্ন সহ ব্যবহার করুন। আমি আপনার ক্যোয়ারি কেবলমাত্র একটি ডেটাবেস (টম ডেস্পের অন্য জবাবে
বলেছি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.