নিরাপদে কোনও ডাটাবেস মুছে ফেলার জন্য সেরা অনুশীলনগুলি কী?


10

আমাদের একটি "জৈব" পরিবেশ রয়েছে, যার অর্থ লোকেরা ন্যূনতম পর্যবেক্ষণ বা ডকুমেন্টেশন সহ দশ বছর ধরে কোডের কোড কোড করে। আমি যে সার্ভারটি ব্যবহার করি তার বেশ কয়েকটি ডাটাবেস রয়েছে যা আমি বিশ্বাস করি যে আর ব্যবহার করা হচ্ছে না; আমি সেগুলি মুছতে এবং আমি কেবল তিনটি ব্যবহার করতে চাই।

বেপরোয়া চরম সময়ে, আমি এই ডাটাবেসগুলি অক্ষম করতে পারি এবং কেউ চিৎকার করার জন্য অপেক্ষা করতে পারি; অন্যদিকে আমি তাদের "স্থির ক্ষেত্রে" চিরকালের জন্য চালিয়ে যেতে পারি। কোনও সার্ভার ব্যবহার হচ্ছে কিনা তা চিহ্নিত করার জন্য আপনি কোন পদক্ষেপগুলি মূল্যবান বলে খুঁজে পেয়েছেন এবং কীভাবে?

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

ধন্যবাদ!


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

বাহ, চারদিকে দুর্দান্ত পয়েন্ট! এবং রোল্যান্ডোমাইএসকিউএলডিবিএ আমার জন্য সকলকে ধন্যবাদ জানাতে ইতিমধ্যে যত্ন নিয়েছে :) আরও পরামর্শ আছে কিনা তা দেখার জন্য আমি এই উন্মুক্ততাটি আরও খানিকটা রেখে দেব, তারপরে আমার সবচেয়ে কার্যকর উত্তরটি বেছে নেওয়ার কূটকীয় কাজটি হবে।
সমস্ত ট্রেডের

উত্তর:


4

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

উদাহরণস্বরূপ, মাইএসকিউএল ৫.x এ আপনার কাছে তথ্য_সেমি.টিবেবল রয়েছে যা দেখতে দেখতে এটি দেখতে:

mysql> desc information_schema.tables;
+-----------------+---------------------+------+-----+---------+-------+
| Field           | Type                | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+---------+-------+
| TABLE_CATALOG   | varchar(512)        | NO   |     |         |       |
| TABLE_SCHEMA    | varchar(64)         | NO   |     |         |       |
| TABLE_NAME      | varchar(64)         | NO   |     |         |       |
| TABLE_TYPE      | varchar(64)         | NO   |     |         |       |
| ENGINE          | varchar(64)         | YES  |     | NULL    |       |
| VERSION         | bigint(21) unsigned | YES  |     | NULL    |       |
| ROW_FORMAT      | varchar(10)         | YES  |     | NULL    |       |
| TABLE_ROWS      | bigint(21) unsigned | YES  |     | NULL    |       |
| AVG_ROW_LENGTH  | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_LENGTH     | bigint(21) unsigned | YES  |     | NULL    |       |
| MAX_DATA_LENGTH | bigint(21) unsigned | YES  |     | NULL    |       |
| INDEX_LENGTH    | bigint(21) unsigned | YES  |     | NULL    |       |
| DATA_FREE       | bigint(21) unsigned | YES  |     | NULL    |       |
| AUTO_INCREMENT  | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_TIME     | datetime            | YES  |     | NULL    |       |
| UPDATE_TIME     | datetime            | YES  |     | NULL    |       |
| CHECK_TIME      | datetime            | YES  |     | NULL    |       |
| TABLE_COLLATION | varchar(32)         | YES  |     | NULL    |       |
| CHECKSUM        | bigint(21) unsigned | YES  |     | NULL    |       |
| CREATE_OPTIONS  | varchar(255)        | YES  |     | NULL    |       |
| TABLE_COMMENT   | varchar(2048)       | NO   |     |         |       |
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.01 sec)

UPDATE_TIME কলামটি শেষ বার কোনও INSERT, UPDATE, বা DELETE সারণিতে প্রয়োগ করা হয়েছিল records প্রতিটি ডাটাবেস শেষবার কখন অ্যাক্সেস করা হয়েছিল তা জানতে আপনি এই জাতীয় অনুসন্ধান চালাতে পারেন:

সর্বশেষে প্রতিটি ডাটাবেসে একটি টেবিল অ্যাক্সেস করা হয়েছিল:

SELECT table_schema,MAX(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL
GROUP BY table_schema;

শেষবারের মতো কোনও ডাটাবেসে কোনও টেবিলটি অ্যাক্সেস করা হয়েছিল:

SELECT MAX(update_time) last_accessed FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql');

সর্বশেষ 10 তারিখ একটি সারণী অ্যাক্সেস করা হয়েছে:

SELECT * FROM
(SELECT * FROM
(SELECT last_accessed,COUNT(1) access_count
FROM (SELECT DATE(update_time) last_accessed
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND update_time IS NOT NULL) A
GROUP BY last_accessed) AA
ORDER BY last_accessed DESC) AAA
LIMIT 10;

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

একবার আপনি কীভাবে বা কদাচিৎ কোনও ডেটাবেস (বা স্কিমা) অ্যাক্সেস করা যায় তা নিশ্চিত হয়ে যাওয়ার পরে আপনার নিজেরাই ডেটা বাদে স্কিমার অনুলিপি সহ পুরাতন ডাটাবেসগুলিকে ম্যানুয়ালি ডাম্প / এক্সপোর্ট করতে হবে। অনুগ্রহ করে ক্ষমা করুন যে আমার উত্তরটি ডিবি অজ্ঞেয়াদি নয়। এসকিউএল সার্ভার এবং ওরাকল ডিবিএর তাদের উত্তরগুলিও এখানে ভয়েস করা উচিত, যেহেতু একটি স্কিমা একটি ডেটাবেস উদাহরণের মধ্যে সংগ্রহ হিসাবে ধারণাটি মাইএসকিউএল এ অস্পষ্ট কিন্তু এসকিউএল সার্ভার এবং ওরাকলে খুব কঠোরভাবে অনুসরণ করা হয়েছে।


খুব ভাল একটি টিপ। আপডেটগুলিতে নজর রাখতে আমি একসাথে ক্যোয়ারীর স্যুট রাখব। ভবিষ্যত প্রজন্মের সুবিধার জন্য, এমএস এসকিউএল-র জন্য স্কিমা স্তরে এ জাতীয় একটি কোয়েরি এখানে দেওয়া হয়েছে:SELECT S.name, MAX(T.modify_date) AS MostRecentDataModification FROM sys.schemas AS S INNER JOIN sys.tables AS T ON S.schema_id = T.schema_id GROUP BY S.name
সমস্ত ট্রেডস

6

আপনি কোনও ট্রেস সেটআপ করার চেষ্টা করতে পারেন যা কেবল সংযোগগুলি এবং সেগুলি কী ডেটাবেসে সংযুক্ত করে capt আমি এই দৌড়াতে কিছুটা রেখে দেব এবং তারপরে নিশ্চিত হয়ে যাব যে কোনও কিছুই এর সাথে সংযোগ স্থাপন করছে না।

এর সাথে একটি সমস্যা হ'ল যদি আপনার কাছে মাস্টার ডিবিতে কিছু কোড খোলার আছে তবে কোডের মধ্যে অন্য ডিবি কল করা। আমি নিশ্চিত না যে কোডটি কতটা খারাপ তা আপনার ডিবিগুলিকে নির্দেশ করছে।

আমি আপনার সমস্ত চাকরিকেও জিজ্ঞাসা করব এবং নিশ্চিত করে ফেলব যে কোনওটি সেই ডিবিটির দিকে নির্দেশ করছে না

আপনি যদি এসকিউএল (২০০৮ আর 2 এন্টারপ্রাইজ) এর সঠিক সংস্করণ থাকে তবে আপনি এসকিউএল নিরীক্ষণও ব্যবহার করতে পারেন।

আপনি যখন কোনও ডিবিতে লগ ইন করেন তখন আপনি কোনও টেবিল আপডেট করতে লগন ট্রিগারও ব্যবহার করতে পারেন। কিছু যদি সেই ডিবিতে সংযুক্ত হয় তবে এটি আপনাকে দেখাতে পারে।


খুব ভাল উত্তর, বিশেষত লগইন ট্রিগার সম্পর্কে !!! মাইএসকিউএলের তেমন কিছুই নেই, যদিও আমি সাধারণ লগটি সক্রিয় করে নির্দিষ্ট আইপি ঠিকানা এবং ডাটাবেসগুলি পরীক্ষা করে এটি অনুকরণ করতে পারি। আপনার একটি +1 !!!
রোল্যান্ডোমাইএসকিউএলডিবিএ

4

এছাড়াও, সিস্টেমগুলি অক্ষম করার ক্ষেত্রে যে কেউ এগিয়ে চলেছে তা নিশ্চিত করার জন্য আপনি কোন পদক্ষেপের পরামর্শ দিচ্ছেন যে তারা কিছু সময়ের জন্য স্বাচ্ছন্দ্যে বিপরীতমুখী থেকে যায়?

এসকিউএল সার্ভারে, আপনি " অফলাইন " ডাটাবেসগুলি নিতে পারেন যা ডেটাবেস উপস্থিত রাখে, তবে কোডের মাধ্যমে এর সাথে সংযোগ স্থাপন সম্ভব করে না। যদি একটি ডেটাবেস "অফলাইন" থাকে তবে এটি এখনও উপলব্ধ থাকে এবং কয়েক মিনিটের মধ্যে এটি আবার ফিরে যায়।

আমার শেষ কাজটিতে আমাদের এমন কিছু পণ্য ছিল যা প্রতি বছর কয়েক মাস ধরে চলছিল, সুতরাং কয়েক মাসের জন্য ডাটাবেস অফ করে বা অফিশনে নেওয়া, সেই পণ্যটির সাথে কাজ করা লোকেরা লক্ষ্য করত না। উদাহরণস্বরূপ, পণ্যগুলির মধ্যে একটি ডাব্লু -২ ফর্মের সাথে জড়িত, সুতরাং ৯৯% ব্যবসায় জানুয়ারী এবং ফেব্রুয়ারিতে ঘটে (বেশিরভাগ সংস্থার জন্য, জানুয়ারীর প্রথম সপ্তাহ পর্যন্ত ডেটা পাওয়া যায় না, এবং ফাইল দেওয়ার জন্য ফেডারাল নিয়ন্ত্রক সময়সীমা তথ্য জানুয়ারীর শেষ ব্যবসায়ের দিন)। ওয়েব সার্ভারটি সাধারণত মে / জুন থেকে ডিসেম্বর অবধি বন্ধ ছিল।

সেই সংস্থায়, আমাদের কাছে ডাটাবেসের "মালিক" - সহ একক ব্যক্তি এই পণ্যটির জন্য দায়ী ছিল with অন্যরা টেবিলগুলির কাঠামোতে আপডেট করতে পারত, যখন কোনও প্রশ্ন জিজ্ঞাসা করতে হত তখন "মালিক" সেই ব্যক্তি ছিলেন go মালিক যদি সংস্থাটি ছেড়ে যায় (গত বছর অবধি বিরল), কাউকে যাওয়ার আগে নতুন মালিক হিসাবে নিয়োগ দেওয়া হবে।

অন্যান্য সংস্থাগুলিতে, আমরা এক চতুর্থাংশের জন্য ডেটাবেসগুলি অফলাইনে নিয়েছি, যদি তারা কিছু না ভাঙার সাথে অফলাইনে থাকে (যেমন মাস / ত্রৈমাসিক প্রতিবেদন), তারা শেষবারের মতো ব্যাক আপ করে এবং মোছা হয়ে যায়। এটি কেউ পরে ফিরে আসতে পারে এবং সেই পরিস্থিতিতে যেমন "ওহ, ফ্রেড প্রকল্পটি শেষ হওয়ার সাথে সাথে আমাদের আলাদা করে রাখতে হয়েছিল, সেই জোন্স প্রকল্পের জন্য এটি ছিল" এমন গল্পগুলির গল্পগুলির জন্য ডেটাবেসগুলি পুনরায় স্থাপন করতে (যা কয়েক মিনিট সময় নেয়) পুনরুদ্ধার করতে দেয়।


চমৎকার মিনি কেস স্টাডি, +1 !!!
RolandoMySQLDBA

@ টাঙ্গুয়ের্না: আমার ধারণা আমি বহু বছর আগে এই বৈশিষ্ট্যটি ব্যবহার করেছি, তবে এটি এই ধরণের ভূমিকার জন্য নিখুঁত, তাই আমাকে স্মরণ করিয়ে দেওয়ার জন্য অনেক ধন্যবাদ।
সমস্ত ট্রেডের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.