データベースを安全に永続的に削除するためのベストプラクティスは何ですか?

dba.stackexchange https://dba.stackexchange.com/questions/3139

  •  16-10-2019
  •  | 
  •  

質問

「オーガニック」環境があります。つまり、人々は最小限の監視または文書化で10年間コードにコードを積み上げました。私が使用するサーバーには、使用されていないと思われるいくつかのデータベースがあります。削除して、実際に使用している3つだけを残したいと思います。

Reckless Extremeでは、これらのデータベースを無効にして、誰かが叫ぶのを待つことができました。もう一方では、私は彼らを「念のため」に永遠に走らせることができました。サーバーが使用されているかどうかを特定する上で、どのような手順が価値があると思いましたか?

また、システムを無効化する際に前進するにつれて、それらが一定期間便利に可逆的なままであることを保証するために、どのようなステップを推奨しますか(例えば、オブジェクトを完全に削除するのではなく、オブジェクトを変更するのではなく名前を変更します)。

ありがとう!

役に立ちましたか?

解決

また、すべてのテーブルのデータタイムスタンプを確認する必要があります。すべてのテーブルのシステム内のメタデータを検索し、最後に更新されたDateTimeごとにそのようなリストを注文し、DESC ORDERの出力をDateTimeごとに表示します。また、テーブルのサイズがわずかなサイズでさえ変化していることを確認することもできます。

たとえば、mysql 5.xでは、このように見える情報_schema.tablesがあります。

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)

列更新_timeは、最後にテーブルに挿入、更新、または削除が最後に適用されたときに記録されます。このようなクエリを実行して、各データベースが最後にアクセスされた時期を確認できます。

前回、各データベースでテーブルにアクセスしました。

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;

これらは、MySQLからそのようなメタデータを取得する方法のほんの一部です。 OracleとSQL Serverには、同様の方法またはより良い方法があると確信しています。

データベース(またはスキーマ)がどれだけ頻繁に、またはめったにアクセスされないかを確認したら、データとは別にスキーマ自体のコピーとともに、熟成したデータベースを手動でダンプ/エクスポートする必要があります。私の答えがDB不可知論者ではないことを弁解してください。 SQLServerとOracle DBAは、データベースインスタンス内のコレクションであるという概念がMySQLでぼやけているが、SQLServerとOracleで非常に厳密に続いているため、ここでも回答を表明する必要があります。

他のヒント

接続のみをキャプチャするトレースと、接続するデータベースを設定することを試みることができます。私はこれを少し走らせたままにしてから、何も接続していないことを確認します。

それに関する問題の1つは、マスターDBにいくつかのコードが開かれているが、コード内で別のDBを呼び出す場合です。あなたのDBを指しているコードがどれほど悪いかはわかりません。

また、すべてのジョブを照会し、そのdbを指し示しているものがないことを確認します

SQL(2008 R2 Enterprise)の適切なバージョンがある場合は、SQL監査を使用することもできます。

誰かがそのDBにログオンしたときに、ログオントリガーを使用してテーブルを更新することもできます。これは、そのDBに何かが接続されているかどうかを示します。

また、システムを無効化する際に前進するにつれて、それらが一定期間便利に可逆的であることを保証するために、どのようなステップをお勧めしますか

SQL Serverでは、データベースを取得できます」オフライン「これにより、データベースは存在しますが、コードを介して接続することは不可能です。データベースが「オフライン」である場合、まだ利用可能であり、数分以内に可逆的です。

私の最後の仕事では、年間数ヶ月間稼働している製品がいくつかあったので、オフになったり、オフラインになったりして、一度に数か月間データベースがその製品を使用している人たちには気づかなかったでしょう。一例として、製品の1つがW-2フォームに関係しているため、1月と2月にビジネスの98%が発生します(ほとんどの企業では、データは1月の最初の週まで利用できません。情報は1月の最後の営業日です)。通常、Webサーバーは5月/6月から12月までオフになりました。

その会社には、データベースの「所有者」が入ったスプレッドシートがありました。これは、製品を担当する1人です。他の人はテーブルの構造を更新することができましたが、「所有者」は質問をしなければならないときに頼りになる人でした。所有者が会社を去った場合(昨年まで珍しい)、誰かが彼らが去る前に新しい所有者に割り当てられます。

他の企業では、データベースを4分の1でオフラインにしました。彼らが何も壊れていない場合(月/四半期報告など)、最後にバックアップされて削除されます。これにより、誰かが後で戻ってきて、「ああ、それはフレッドプロジェクトが終了したときに取っておかなければならなかったジョーンズプロジェクトのためのものだった」などのストーリーを持っている状況のデータベース(数分かかる)を復元することができます。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top