Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Kesalahan menjatuhkan basis data (errno 13; errno 17; errno 39)

Perbaikan Cepat

Jika Anda hanya ingin menghapus database apa pun yang terjadi (tetapi tolong pertama baca seluruh pos:kesalahan diberikan karena suatu alasan , dan mungkin penting untuk mengetahui apa alasannya!), Anda dapat:

  • cari datadir dengan perintah SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
  • hentikan server MySQL (mis. service mysql stop atau rcmysqld stop atau serupa di Linux, NET STOP <name of MYSQL service, often MYSQL57 or similar> atau melalui SERVICES.MSC di Windows)
  • buka direktori data (ini adalah tempat Anda harus menyelidiki; lihat di bawah)
  • hapus direktori dengan nama yang sama dengan database
  • mulai server MySQL lagi dan sambungkan
  • jalankan DROP DATABASE
  • itu saja!

Alasan Errno 13

MySQL tidak memiliki izin menulis pada direktori induk di mana mydb folder berada.

Periksa dengan

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

Di Linux, ini juga dapat terjadi jika Anda mencampur dan mencocokkan paket MySQL dan AppArmor/SELinux. Apa yang terjadi adalah AppArmor mengharapkan mysqld memiliki datanya di /path/to/data/dir , dan memungkinkan R/W penuh di sana, tetapi MySQLd berasal dari distribusi atau build yang berbeda, dan sebenarnya menyimpan datanya di tempat lain (mis.:/var/lib/mysql5/data/** sebagai lawan dari /var/lib/mysql/** ). Jadi yang Anda lihat adalah direktori tersebut memiliki izin dan kepemilikan yang benar namun masih memberikan Errno 13 karena apparmor/selinux tidak mengizinkan akses ke sana.

Untuk memverifikasi, periksa log sistem untuk pelanggaran keamanan, periksa konfigurasi apparmor/selinux secara manual, dan/atau tiru pengguna mysql dan coba buka direktori var dasar, lalu cd secara bertahap hingga Anda berada di direktori target, dan jalankan sesuatu seperti touch aardvark && rm aardvark . Jika izin dan kepemilikan cocok, namun hal di atas menghasilkan kesalahan akses, kemungkinan itu adalah masalah kerangka kerja keamanan.

Alasan Errno 39

Kode ini berarti "direktori tidak kosong". Direktori berisi beberapa tersembunyi file MySQL tidak tahu apa-apa tentang. Untuk file yang tidak disembunyikan, lihat Errno 17. Solusinya sama.

Alasan Errno 17

Kode ini berarti "file ada". Direktori berisi beberapa file MySQL yang tidak ingin dihapus oleh MySQL. File seperti itu bisa saja dibuat oleh SELECT ... INTO OUTFILE "filename"; perintah di mana filename tidak memiliki jalan. Dalam hal ini, proses MySQL membuatnya di direktori kerjanya saat ini, yang (diuji pada MySQL 5.6 pada OpenSuSE 12.3) adalah direktori data database , misalnya /var/lib/mysql/data/nameofdatabase .

Reproduksibilitas:

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)

Pindahkan file ke luar (atau hapus jika tidak diperlukan) dan coba lagi. Selain itu, tentukan mengapa mereka dibuat di tempat pertama - ini bisa menunjukkan bug di beberapa aplikasi . Atau lebih buruk:lihat di bawah...

PERBARUI:Kesalahan 17 sebagai tanda eksploitasi

Ini terjadi pada sistem Linux dengan Wordpress diinstal. Sayangnya pelanggan berada di bawah batasan waktu dan saya tidak dapat membayangkan disk atau melakukan putaran forensik nyata - saya menginstal ulang seluruh mesin dan Wordpress diperbarui dalam prosesnya, jadi saya hanya dapat mengatakan bahwa saya hampir yakin mereka melakukannya melalui plugin ini .

Gejala :mysql direktori data berisi tiga file dengan ekstensi PHP. Tunggu, apa?!? -- dan di dalam file ada sebagian besar kode base64 yang diteruskan ke base64_decode , gzuncompress dan [eval()][2] . Aha . Tentu saja ini hanya upaya pertama, yang gagal. Situsnya bagus dan benar-benar pwn3d.

Jadi jika Anda menemukan file di direktori data mysql Anda yang menyebabkan Error 17, periksa dengan file utilitas atau scan dengan antivirus. Atau periksa isinya secara visual. Jangan menganggap itu terjadi karena kesalahan yang tidak berbahaya.

(Tak perlu dikatakan, untuk memeriksa file secara visual, jangan pernah klik dua kali ).

Korban dalam kasus ini (dia punya beberapa teman "melakukan pemeliharaan") tidak akan pernah menduga dia telah diretas sampai pemeliharaan/pembaruan/skrip apa pun menjalankan DROP DATABASE (jangan tanya kenapa - aku tidak yakin bahkan aku ingin tahu ) dan mendapatkan kesalahan. Dari beban CPU dan pesan syslog, saya cukup yakin bahwa host telah menjadi ladang spam.

Satu lagi Kesalahan 17

Jika Anda rsync atau salin antara dua instalasi MySQL dari versi yang sama tetapi platform atau sistem file yang berbeda seperti Linux atau Windows (yang tidak disarankan, dan berisiko, tetapi banyak yang melakukannya), dan khususnya dengan sensitivitas huruf besar/kecil pengaturan, Anda dapat secara tidak sengaja berakhir dengan dua versi dari file yang sama (baik data, indeks, atau metadata); ucapkan Customers.myi dan Customer.MYI . MySQL menggunakan salah satunya dan tidak tahu apa-apa tentang yang lain (yang mungkin ketinggalan zaman dan menyebabkan sinkronisasi yang membawa bencana). Saat menjatuhkan database, yang juga terjadi di banyak mysqldump ... | ... mysql skema cadangan, DROP akan gagal karena file tambahan itu (atau itu file tambahan) ada. Jika ini terjadi, Anda seharusnya dapat mengenali file usang yang perlu dihapus secara manual dari waktu file, atau dari fakta bahwa skema kasusnya berbeda dari sebagian besar tabel lainnya.

Menemukan direktori data

Secara umum, Anda dapat menemukan direktori data dengan memeriksa my.cnf file (/etc/my.cnf , /etc/sysconfig/my.cnf , /etc/mysql/my.cnf di Linux; my.ini di direktori file program MySQL di Windows), di bawah [mysqld] heading, sebagai datadir .

Atau Anda dapat menanyakannya ke MySQL sendiri:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Bagaimana cara MEMESAN BERDASARKAN RELEVANSI? Tabel INNODB

  2. Di PHP dengan PDO, bagaimana cara memeriksa kueri parametris SQL akhir?

  3. Kesalahan:Metode atau operasi tidak diterapkan. saat membuat perancah Database MYSQL

  4. Di mana Saya Harus Menyimpan String Koneksi database?

  5. Perubahan pada my.cnf tidak berlaku (Ubuntu 16.04, mysql 5.6)