5

昨日、MySQL データベースへの適度に複雑なテーブルの挿入を実行するシェル スクリプトに取り組んでいました。当然のことながら、コマンドを実行したり、サンプル クエリを実行したり、テスト サイクル間でテスト行を削除したりするために、mysqlクライアント シェル ウィンドウを開いたままにしていました。describe

はい、これはライブの本番データベース上にありました。

コーディングが完了した時点で、スクリプトを実行してバッチ エントリを処理する前に、同僚に自分の作業を確認するように依頼しました。私たちはすべてを検討し、彼はそれが彼にとって正しいように見えることに同意し、私はスクリプトを開始しました. 問題ない。

次に、ライブ シェルに戻り、履歴から 1 行を取り出し、where句を変更して結果の挿入を確認し、[Enter]を押しました...

...残念ながら、編集中のコマンド全体を見ていませんでした! deleteではなく、ステートメントでしたselect

おっと。

わかりました。別の DBMS サーバーをセットアップし、この DB のダンプをそこに復元して、そこですべてのテストを行うことができたはずです。これがより安全で、より規律あるものだったことは誰もが知っています。また、ライブストアで作業する方が便利な場合があることもわかっています。(この場合、リスクは予想よりもやや低くなります...問題のDBはバッチ処理に使用され、わずか20分経過したバックアップから10分以内に復元できましたdelete)。

ただし、これは疑問を思い起こさせます:mysqlクライアント シェルに読み取り専用にするオプション (またはパッチ) はありますか? インタラクティブ履歴に保存するものを変更するオプションはありますか? (同様に「危険な」ステートメントを「再実行する前に確認を求めるプロンプト」としてマークする何か?deleteクライアントには機能に似たものがありますか?drop tablemysqlbash HISTIGNORE

この種の作業を行うためのより安全な方法は何ですか (DB の完全に別の開発用コピーで作業する以外に)?

4

2 に答える 2

5

完全な読み取り専用アクセスが必要な場合は、書き込み権限のないユーザー アカウントを作成します。

または、トランザクションでの作業に慣れてください。:)BEGINシェルを開いたときに入力し、COMMIT本当に必要な場合にのみ入力してください。

于 2009-10-07T18:29:55.607 に答える
5

--safe-updatesオプションを使用すると、途中まで進めることができます。

最良の方法は、読み取り専用アクセスの新しいユーザーを作成し、SELECT のみを許可することです。例えば:


    GRANT SELECT ON *.* TO readonly@'%' IDENTIFIED BY 'password';
    FLUSH PRIVILEGES;

于 2009-10-07T18:33:14.180 に答える