Nguyên nhân lỗi: Bảng không hợp lệ (cũ?) Hoặc tên cơ sở dữ liệu 'mất + tìm thấy'


8

Nhật ký MySQL của tôi hiển thị các lỗi trùng lặp:

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

Tôi có một cơ sở dữ liệu có tên #mysql50#lost+foundnhưng dường như tôi không thể xóa nó.

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>

Tôi đang vận hành phiên bản Máy chủ: 5.5.40 Phân phối bởi Dự án Cộng đồng IUS trên Centos 6.

Mỗi MySQL đang chạy RẤT chậm trên CentOS 6x (không phải 5x) , datadir của tôi nằm trên ext3 với tùy chọn rào cản = 0.

Điều gì gây ra lỗi này và làm thế nào để loại bỏ nó?

Câu trả lời:


14

Có vẻ như bạn datadirđang ở trong một hệ thống tập tin của riêng mình.

Các hệ thống tệp Ext, giống như hầu hết các FS trong Unix, đều có thư mục gốc lost+found. Nó tồn tại để cho phép các tệp bị tách ra (nghĩa là chúng có nội dung, nhưng không có mục nhập thư mục liên quan) được gắn lại ở đâu đó khi hệ thống tệp không nhất quán được fscked (xem, ví dụ: https://unix.stackexchange.com/ câu hỏi / 18154 / what-is-the-aim-of-the-thefound-thư mục-in-linux-and-unix để biết thêm chi tiết). Mục đích này rất quan trọng trong việc khắc phục thảm họa, vì vậy bạn không nên xóa thư mục.

Vấn đề của bạn phát sinh khi điểm gắn kết, trên đó hệ thống tệp chứa thư mục đó được gắn kết, được trao hoàn toàn cho một ứng dụng hy vọng mọi thứ trong điểm gắn kết đó thuộc về nó. MySQL là một trong số đó, nó cố gắng diễn giải lost+foundthư mục là một cái gì đó liên quan đến db và (không hợp lý) thất bại.

Đặt cược tốt nhất của bạn là không bao giờ dành toàn bộ FS cho một ứng dụng, mà thay vào đó, gắn FS vào một số điểm gắn kết không dành riêng cho ứng dụng, ví dụ: /data1tạo thư mục con theo đó, ví dụ: /data1/mysqlvà cấu hình lại ứng dụng để sử dụng thư mục đó làm thư mục của nó datadir.


12

MadHatter giải thích rõ lỗi. Nhưng kể từ đó thời thế đã thay đổi và bây giờ MySQL ( kể từ 5.6.3 ) có một tùy chọn bỏ qua thư mục này. Chỉ cần thêm tuyên bố này vào /etc/mysql/my.cnftập tin của bạn :

ignore-db-dir=lost+found

Sau khi khởi động lại MySQL, bạn có thể kiểm tra nó bằng lệnh:

show global variables like 'ignore_db_dirs';

Nếu bạn muốn bỏ qua nhiều thư mục, bạn cần chỉ định tùy chọn cho từng thư mục riêng biệt.

Nguồn: http : //www.chrryptender.com/ignoring-the-lostfound-directory-in-your-datadir/


3

Vị trí của my.cnf trong CentOS 7.2 nếu bạn đang sử dụng MariaDB

/etc/my.cnf

Bạn có thể khởi động lại dịch vụ với

systemctl restart mariadb.service

bỏ qua db-dir nên được đặt trong phần [mysqld] và không nằm dưới [mysqld_safe].

[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

1

Vì MySQL của chúng tôi chưa hiểu ignore_db_dirs, tôi đã làm

# chmod 0 lost+found

đã giải quyết vấn đề (này).


0

MariaDb là ign_db_dirs MySQL là ign_db_dir - không có "s"

Xem https://mariadb.com/kb/en/l Library / server-system-biến / #ignore_db_dirs

Tôi đã có một thư mục ẩn như dưới đây

mysql50 # .local

vì vậy trong etc / my.cnf --- cho MariaDB, đó là

[mysqld] ign_db_dirs = .local

và khởi động lại máy chủ cơ sở dữ liệu - sau đó kiểm tra cơ sở dữ liệu không còn trong lệnh SHOW DATABASES hoặc với MariaDB có "mysqlshow" từ dòng lệnh

Sau đó, bạn có thể xóa thư mục và bất cứ thứ gì nằm dưới nó trong / var / lib / mysql, sau đó chỉnh sửa lại tệp /etc/my.cnf và nhận xét lệnh hoặc xóa nó và khởi động lại máy chủ - sự cố đã được khắc phục

KHÔNG CHỈ XÓA TRỰC TIẾP TRỰC TIẾP KHÔNG ĐƯỢC thực hiện điều này ở trên FIRST = vì kho dữ liệu mà máy chủ lưu giữ sẽ bị hỏng và bạn không thể khởi động lại một lần nữa khi phải xóa tất cả cơ sở dữ liệu và khôi phục cơ sở dữ liệu khỏi bản sao lưu hoặc tệ hơn - và đó là MỘT NGOÀI LỚN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.