mysqldump: Couldn't execute SELECT LIBRARY_NAME FROM INFORMATION_SCHEMA.LIBRARIES
Khi mysqldump
và MySQL Server "không hiểu nhau": Lỗi "Unknown table 'LIBRARIES'" và cách xử lý
Gần đây, khi thực hiện một thao tác đơn giản trong dự án Laravel, cụ thể là chạy lệnh schema:dump --prune
để tạo một bản sao lưu cấu trúc database, tôi đã gặp phải một lỗi lạ. Mọi thứ dường như không hoạt động và màn hình terminal hiện ra một thông báo lỗi khó hiểu:
mysqldump: Couldn't execute 'SELECT LIBRARY_NAME FROM INFORMATION_SCHEMA.LIBRARIES WHERE LIBRARY_SCHEMA = 'your_database' ORDER BY LIBRARY_NAME': Unknown table 'LIBRARIES' in information_schema (1109)
Sau đó là một lỗi ProcessFailedException
của Symfony, chỉ ra rằng lệnh mysqldump
đã thất bại. Ban đầu tôi nghĩ có thể do cấu hình database sai, nhưng mọi thứ khác vẫn hoạt động bình thường. Sau một hồi tìm hiểu, tôi đã tìm ra nguyên nhân và cách khắc phục.
Nguyên nhân: Bất đồng ngôn ngữ giữa mysqldump
và MySQL Server
Vấn đề hóa ra không phải ở code của Laravel hay cấu hình database, mà là do sự không tương thích về phiên bản giữa công cụ mysqldump
và máy chủ MySQL đang chạy.
mysqldump
: Tôi đang sử dụng phiên bản9.3.0
được cài đặt qua Homebrew, đây là phiên bản mới nhất và tương ứng với MySQL 8.3.- MySQL Server: Máy chủ MySQL của tôi lại đang chạy phiên bản
8.0.27
.
Sự khác biệt nhỏ này lại gây ra lỗi nghiêm trọng. Phiên bản mysqldump
mới hơn (từ 9 trở lên) khi chạy sẽ cố gắng truy vấn một bảng có tên là INFORMATION_SCHEMA.LIBRARIES
để lấy thông tin về các thư viện plugin. Tuy nhiên, bảng này lại không tồn tại trên máy chủ MySQL phiên bản 8.0.27
, dẫn đến lỗi "Unknown table" (bảng không xác định).
Nói một cách đơn giản, giống như bạn đang dùng một cuốn từ điển hiện đại để tra cứu một cuốn sách cổ, một số từ mới sẽ không xuất hiện trong cuốn sách đó.
Cách giải quyết: Đưa chúng về cùng một "tiếng nói"
Sau khi xác định được nguyên nhân, tôi có hai lựa chọn chính để giải quyết vấn đề này.
Lựa chọn 1: Sử dụng một phiên bản mysqldump
cũ hơn
Nếu việc cập nhật máy chủ MySQL là không khả thi, bạn có thể giải quyết bằng cách cài đặt và sử dụng một phiên bản mysqldump
cũ hơn, tương thích với máy chủ hiện tại của bạn.
-
Bước 1: Cài đặt
mysql-client
phiên bản 8.0 qua Homebrew:brew install mysql-client@8.0
-
Bước 2: Laravel theo mặc định sẽ tìm
mysqldump
trong các đường dẫn hệ thống. Để buộc nó sử dụng phiên bản 8.0 vừa cài đặt, chúng ta cần thay đổi đường dẫn trong file source của Laravel. Mở filevendor/laravel/framework/src/Illuminate/Database/Schema/MySqlSchemaState.php
. -
Bước 3: Tìm đến hàm
baseDumpCommand()
và sửa đường dẫn của lệnhmysqldump
từ mặc định thành đường dẫn của phiên bản 8.0./** * Get the base dump command arguments for MySQL as a string. * * @return string */ protected function baseDumpCommand() { // Sửa 'mysqldump' thành '/opt/homebrew/opt/[email protected]/bin/mysqldump' $command = 'mysqldump '.$this->connectionString().' --no-tablespaces --skip-add-locks --skip-comments --skip-set-charset --tz-utc --column-statistics=0'; if (! $this->connection->isMaria()) { $command .= ' --set-gtid-purged=OFF'; } return $command.' "${:LARAVEL_LOAD_DATABASE}"'; }
Lưu ý: Việc chỉnh sửa trực tiếp file trong thư mục vendor
là không được khuyến khích vì nó có thể bị ghi đè khi bạn chạy composer update
. Đây chỉ là một giải pháp tạm thời để bạn tiếp tục công việc. Tốt nhất bạn nên tìm cách cấu hình lại môi trường để mysqldump
mặc định của bạn là phiên bản phù hợp.
Lựa chọn 2: Cập nhật máy chủ MySQL
Nếu có thể, hãy cập nhật máy chủ MySQL của bạn lên phiên bản mới tương thích với phiên bản mysqldump
hiện tại.
- Bước 1: Sao lưu dữ liệu database hiện tại để phòng rủi ro.
- Bước 2: Dừng dịch vụ MySQL.
- Bước 3: Chạy
brew upgrade mysql
(nếu dùng Homebrew) hoặc làm theo hướng dẫn chính thức để cập nhật máy chủ. - Bước 4: Khởi động lại dịch vụ MySQL.
Kết luận
Lỗi "Unknown table 'LIBRARIES'" là một ví dụ điển hình cho thấy sự quan trọng của việc đảm bảo tính tương thích giữa các công cụ trong hệ thống phát triển. Mặc dù là một lỗi nhỏ, nhưng nó lại có thể làm gián đoạn quy trình làm việc. Hy vọng bài viết này sẽ giúp bạn tiết kiệm thời gian và giải quyết vấn đề một cách nhanh chóng.
Ủng hộ Chung Nguyễn Blog
Chung Nguyễn Blog sử dụng FlashPanel - Dịch vụ quản trị máy chủ chuyên nghiệp để quản lý VPS
#FlashPanel là dịch vụ cloud panel trên nền tảng web hỗ trợ khách hàng:
- * Quản lý máy chủ số lượng nhiều
- * Không có kinh nghiệm quản lý máy chủ
- * Thích sử dụng giao diện web đơn giản, trực quan hơn terminal
- * Quá nhàm chán với việc ghi nhớ và lặp lại việc gõ các câu lệnh
- * Muốn tự động hóa mọi thao tác
- * Muốn tiết kiệm thời gian quản trị máy chủ
- * Muốn tiết kiệm tiền bạc, nhân lực quản trị máy chủ 👉 https://flashpanel.io
Các bài viết trên website thường xuyên được đăng tải và cập nhật trên trang Facebook Chung Nguyễn Blog hãy tặng cho Chung một LIKE nhé! Mãi yêu các bạn!
813 👍Đánh giá bài viết

Bình luận