sql >> データベース >  >> RDS >> Mysql

MySQL:データベースの削除中にエラーが発生しました(errno 13; errno 17; errno 39)

    クイックフィックス

    何があってもデータベースを削除したいだけの場合(ただし、お願いします 最初に投稿全体を読んでください:エラーは理由で与えられました 、そしてその理由を知ることは重要かもしれません!)、次のことができます:

    • コマンドSHOW VARIABLES WHERE Variable_name LIKE '%datadir%';を使用してデータディレクトリを検索します
    • MySQLサーバーを停止します(例:service mysql stop またはrcmysqld stop Linuxの場合は、NET STOP <name of MYSQL service, often MYSQL57 or similar> またはSERVICES.MSCを介して Windowsの場合)
    • datadirに移動します(ここで調査する必要があります。以下を参照してください)
    • データベースと同じ名前のディレクトリを削除します
    • MySQLサーバーを再起動し、それに接続します
    • ドロップデータベースを実行する
    • 以上です!

    Errno13の理由

    MySQLには、mydbが存在する親ディレクトリへの書き込み権限がありません フォルダが存在します。

    で確認してください

    ls -la /path/to/data/dir/         # see below on how to discover data dir
    ls -la /path/to/data/dir/mydb   
    

    Linuxでは、MySQLパッケージとAppArmor/SELinuxパッケージを組み合わせて使用​​した場合にもこれが発生する可能性があります。何が起こるかというと、AppArmorはmysqldがそのデータを/path/to/data/dirに持っていることを期待しているということです。 、そこで完全なR / Wを許可しますが、MySQLdは別のディストリビューションまたはビルドからのものであり、実際にはそのデータを他の場所に保存します。 (例:/var/lib/mysql5/data/** /var/lib/mysql/**とは対照的に )。つまり、ディレクトリには正しい権限と所有権があることがわかります。 それでも、apparmor / selinuxはErrno13へのアクセスを許可しないため、Errno13を提供します。

    確認するには、システムログでセキュリティ違反を確認し、apparmor / selinux構成を手動で検査するか、mysqlユーザーになりすましてベースvarディレクトリに移動し、ターゲットディレクトリに移動するまで段階的にcdして、次のようなコードを実行します。 touch aardvark && rm aardvark 。権限と所有権が一致していても、上記でアクセスエラーが発生した場合は、セキュリティフレームワークの問題である可能性があります。

    Errno39の理由

    このコードは「ディレクトリが空ではない」ことを意味します。ディレクトリには非表示が含まれています MySQLが何も知らないファイル。非表示でないファイルについては、Errno17を参照してください。解決策は同じです。

    Errno17の理由

    このコードは「ファイルが存在する」ことを意味します。ディレクトリには、MySQLが削除を認識しないMySQLファイルが含まれています。このようなファイルは、SELECT ... INTO OUTFILE "filename";によって作成された可能性があります。 コマンドwherefilename 道はありませんでした。この場合、MySQLプロセスは、現在の作業ディレクトリ(OpenSuSE12.3のMySQL5.6でテスト済み)にデータベースのデータディレクトリを作成します。 、例: /var/lib/mysql/data/nameofdatabase

    再現性:

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1676
    Server version: 5.6.12-log openSUSE package
    [ snip ]    
    
    mysql> CREATE DATABASE pippo;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> USE pippo;
    Database changed
    mysql> SELECT version() INTO OUTFILE 'test';
    Query OK, 1 row affected (0.00 sec)
    
    mysql> DROP DATABASE pippo;
    ERROR 1010 (HY000): Error dropping database (can't rmdir './pippo/', errno: 17)
    
    -- now from another console I delete the "test" file, without closing this connection
    -- and just retry. Now it works.
    
    mysql> DROP DATABASE pippo;
    Query OK, 0 rows affected (0.00 sec)
    

    ファイルを外部に移動し(または必要がない場合は削除して)、再試行してください。 また、そもそもなぜそれらが作成されたのかを判断します。これは、一部のアプリケーションのバグを示している可能性があります 。またはさらに悪いことに:以下を参照してください...

    更新:エクスプロイトフラグとしてのエラー17

    これは、WordpressがインストールされているLinuxシステムで発生しました。残念ながら、お客様は時間の制約を受けており、ディスクのイメージを作成することも、実際のフォレンジックラウンドを行うこともできませんでした。マシン全体を再インストールし、その過程でWordpressが更新されたため、ほぼ> このプラグイン を介してそれを行ったことは確かです 。

    症状mysql データディレクトリには、拡張子がPHPの3つのファイルが含まれていました。 待って、何?!? -そしてファイルの中にはbase64_decodeに渡されたbase64コードの大部分がありました 、gzuncompress および[eval()][2]あは 。もちろん、これらは最初の試みであり、失敗したものでした。このサイトは本当にpwn3dでした。

    したがって、mysqlデータディレクトリでエラー17の原因となっているファイルを見つけた場合は、 fileで確認してください。 ユーティリティ または、アンチウイルスでスキャンします。または、その内容を視覚的に検査します。 無害な間違いのためにそこにあると思い込まないでください。

    (言うまでもなく、ファイルを視覚的に検査するには、ダブルクリックしないでください

    この場合の被害者(彼には「メンテナンスを行う」友人がいた)は、メンテナンス/更新/スクリプトがDROP DATABASEを実行するまで、ハッキングされたとは思いもしませんでした。 (理由を聞かないでください-知りたいことすらわかりません )エラーが発生しました。 CPUの負荷とsyslogメッセージから、ホストがスパムファームになったことはかなり確かです。

    さらに別のエラー17

    rsyncの場合 または、同じバージョンの2つのMySQLインストール間でコピーします。異なるプラットフォームまたはファイルシステム LinuxやWindowsなど(推奨されておらず、リスクがありますが、それでも多くの場合はそうします)、特に大文字と小文字の区別 設定では、誤って2つのバージョンになってしまう可能性があります 同じファイル(データ、インデックス、またはメタデータのいずれか)。 Customers.myiと言います およびCustomer.MYI 。 MySQLはそれらの1つを使用し、もう1つについては何も知りません(これは古く、悲惨な同期につながる可能性があります)。データベースを削除する場合、これは多くのmysqldump ... | ... mysql バックアップスキーム、DROP その余分なファイル(またはそれら 余分なファイル)が存在します。これが発生した場合、ファイル時間から、またはそれらのケーススキームが他のテーブルの大部分とは異なるという事実から、手動で削除する必要がある廃止されたファイルを認識できるはずです。

    データディレクトリの検索

    一般に、データディレクトリは、my.cnfを調べることで見つけることができます。 ファイル(/etc/my.cnf/etc/sysconfig/my.cnf/etc/mysql/my.cnf Linuxの場合; my.ini WindowsのMySQLプログラムファイルディレクトリ内)、[mysqld]の下 見出し、datadir

    または、MySQL自体に問い合わせることもできます:

    mysql> SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | datadir       | /var/lib/mysql/ |
    +---------------+-----------------+
    1 row in set (0.00 sec)
    


    1. SQL ServerのCONVERT()とTRY_CONVERT:違いは何ですか?

    2. varbinaryを文字列に変換するSQLServer

    3. EntityFrameworkでのMariaDBの使用

    4. 既存の権限を持つユーザーをすばやく削除する方法