Penyebab kesalahan: Tabel atau nama database tidak valid (lama?) 'Hilang + ditemukan'

8

Log MySQL saya menunjukkan kesalahan duplikat:

141223  5:47:21 [ERROR] Invalid (old?) table or database name 'lost+found'

Saya memiliki database yang bernama #mysql50#lost+foundtetapi saya tidak bisa menghapusnya.

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| maindatabas         |
| maindatabas_help    |
| maindatabas_tracker |
| gitlabhq_production |
| locations           |
| #mysql50#lost+found |
| mysql               |
| osticket            |
| performance_schema  |
+---------------------+
10 rows in set (0.00 sec)

mysql> DROP DATABASE `#mysql50#lost+found`;
ERROR 1008 (HY000): Can't drop database '#mysql50#lost+found'; database doesn't exist
mysql>

Saya mengoperasikan versi Server: 5.5.40 Didistribusikan oleh The IUS Community Project di Centos 6.

Per MySQL berjalan SANGAT lambat pada CentOS 6x (bukan 5x) , datadir saya pada ext3 dengan penghalang = 0 pilihan.

Apa yang menyebabkan kesalahan ini, dan bagaimana cara menghilangkannya?

pengguna1032531
sumber

Jawaban:

14

Bagi saya sepertinya Anda datadirberada di sistem file sendiri.

Sistem file Ext, seperti kebanyakan FS di bawah Unix, memiliki root pada direktori yang disebut lost+found. Itu ada untuk memungkinkan file yang terlepas (yaitu, mereka memiliki konten, tetapi tidak ada entri direktori terkait) untuk disambungkan kembali di suatu tempat ketika sistem file yang tidak konsisten fscked (lihat, misalnya, https://unix.stackexchange.com/ pertanyaan / 18154 / apa-tujuan-folder-hilang-ditemukan-di-linux-dan-unix untuk lebih jelasnya). Tujuan ini penting dalam pemulihan bencana, jadi Anda tidak harus menghapus direktori.

Masalah Anda muncul ketika mount point, di mana sistem file yang berisi direktori itu di-mount, diserahkan sepenuhnya ke aplikasi yang mengharapkan semua yang ada di mount point itu menjadi miliknya. MySQL adalah salah satunya, ia mencoba untuk menafsirkan lost+founddirektori sebagai sesuatu yang berhubungan dengan db, dan (tidak masuk akal) gagal.

Taruhan terbaik Anda adalah jangan pernah mendedikasikan seluruh FS untuk suatu aplikasi, tetapi sebaliknya untuk memasang FS pada beberapa titik pemasangan aplikasi-non-spesifik, misalnya /data1, membuat subdirektori di bawahnya, misalnya /data1/mysql, dan mengkonfigurasi ulang aplikasi untuk menggunakan direktori itu sebagai datadir.

MadHatter
sumber
12

MadHatter menjelaskan dengan baik kesalahannya. Tetapi sejak itu zaman telah berubah dan sekarang MySQL ( sejak 5.6.3 ) memiliki opsi untuk mengabaikan direktori ini. Cukup tambahkan pernyataan ini ke /etc/mysql/my.cnffile Anda :

ignore-db-dir=lost+found

Setelah MySQL restart, Anda dapat memeriksanya dengan perintah:

show global variables like 'ignore_db_dirs';

Jika Anda ingin mengabaikan beberapa direktori, Anda perlu menentukan opsi untuk masing-masing direktori secara terpisah.

Sumber: http://www.chriscalender.com/ignoring-the-lostfound-directory-in-your-datadir/

Marki555
sumber
3

Lokasi my.cnf di bawah CentOS 7.2 jika Anda menggunakan MariaDB ada di

/etc/my.cnf

Anda dapat memulai kembali layanan dengan

systemctl restart mariadb.service

Abaikan-db-dir harus diletakkan di bawah bagian [mysqld] dan tidak di bawah [mysqld_safe] satu.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

ignore-db-dir=lost+found

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
Strahinja Radman
sumber
1

Karena MySQL kami belum mengerti ignore_db_dirs, saya mengerti

# chmod 0 lost+found

yang memecahkan masalah (ini).

Gerrit A. Smit
sumber
0

MariaDb adalah ign_db_dirs MySQL is ign_db_dir - tanpa "s"

Lihat https://mariadb.com/kb/en/library/server-system-variables/#ignore_db_dirs

Saya memiliki direktori tersembunyi seperti di bawah ini

mysql50 # .local

jadi di etc / my.cnf --- untuk MariaDB itu

[mysqld] diabaikan_db_dirs = .local

dan restart server database - kemudian periksa database tidak lagi dalam perintah SHOW DATABASES atau dengan MariaDB ada "mysqlshow" dari baris perintah

Kemudian Anda dapat menghapus direktori dan apa pun yang ada di bawahnya di / var / lib / mysql, kemudian mengedit kembali file /etc/my.cnf dan berkomentar perintah atau menghapusnya, dan restart server lagi - masalahnya lagi adalah

JANGAN HANYA HAPUS DIREKTORI TIDAK DIINGINKAN TANPA melakukan ini di atas PERTAMA = karena datastore yang disimpan server akan rusak dan Anda mungkin tidak mendapatkannya untuk memulai kembali lagi tanpa harus menghapus semua basis data dan memulihkan basis data dari cadangan atau lebih buruk - dan itu adalah OUCH BESAR.

wilburunion
sumber