algolia search

Tìm thấy x bài viết trong xms.

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ản 9.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ở file vendor/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ệnh mysqldump 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.

Đánh giá bài viết

Thích thì like
mysqldump: Couldn't execute SELECT LIBRARY_NAME FROM INFORMATION_SCHEMA.LIBRARIES
0/5 0 votes

Bình luận

Hiển thị bình luận Facebook