CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng blog CFSDN MySQL Management này được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, vui lòng thích nó.
Đối với các trang web tập trung vào nội dung, chìa khóa để thiết kế tốt là cơ sở dữ liệu quan hệ. Trong hướng dẫn này, chúng tôi đã thiết lập cơ sở dữ liệu của mình bằng hệ thống quản lý cơ sở dữ liệu quan hệ MySQL (RDBMS). MySQL là sự lựa chọn phổ biến cho các nhà phát triển trang web, không chỉ vì nó miễn phí khi sử dụng cho mục đích phi thương mại trên mọi nền tảng mà còn vì nó rất dễ thiết lập và sử dụng. Như chúng ta đã thấy trong Chương 1, với hướng dẫn đúng, người dùng mới có thể thiết lập và chạy máy chủ MySQL trong vòng chưa đầy 30 phút (hoặc thậm chí 10 phút đối với người dùng có kinh nghiệm!).
Nếu tất cả những gì bạn muốn làm là thiết lập môi trường máy chủ MySQL để thực hiện một số ví dụ và bài tập, thì các thiết lập ban đầu mà chúng tôi sử dụng trong quá trình cài đặt ở Chương 1 là đủ cho bạn. Tuy nhiên, nếu bạn muốn xây dựng một cơ sở dữ liệu thực sự cho một trang web—có thể là một trang web quan trọng đối với công ty của bạn—thì bạn sẽ cần phải tìm hiểu một chút về MySQL.
Đối với các hoạt động kinh doanh nằm trong doanh nghiệp hoạt động trên nền tảng Internet, việc sao lưu dữ liệu là rất quan trọng. Thật không may, vì các tác vụ sao lưu thường không được nhiều người quản trị quan tâm nên tầm quan trọng của chúng thường không được nhận ra và do đó chúng thường không được thực hiện "đủ tốt" cho một ứng dụng. Nếu đến giờ bạn vẫn chưa hiểu “chúng ta có cần sao lưu cơ sở dữ liệu không” hoặc bạn nghĩ “cơ sở dữ liệu sẽ được sao lưu cùng với những thứ khác”, thì bạn cần xem kỹ nội dung của chương này. Chúng tôi sẽ giải thích lý do tại sao các giải pháp sao lưu tệp thông thường không đủ cho nhiều máy chủ MySQL và sau đó chúng tôi sẽ giới thiệu "cách đúng đắn" để sao lưu và khôi phục cơ sở dữ liệu MySQL.
Trong chương đầu tiên, chúng ta thiết lập máy chủ MySQL và kết nối với cơ sở dữ liệu với tư cách là 'root' bằng mật khẩu. Người dùng 'root' của MySQL (không nên nhầm lẫn với người dùng 'root' của Unix) có quyền đọc/ghi đối với tất cả các thư viện và bảng. Trong nhiều trường hợp, chúng ta cần tạo những người dùng khác chỉ có thể truy cập vào một số cơ sở dữ liệu và bảng dữ liệu nhất định và chúng ta cũng cần hạn chế quyền truy cập đó (ví dụ: quyền truy cập chỉ đọc trực tiếp vào các bảng đã chỉ định). Trong chương này, chúng ta sẽ học cách sử dụng hai lệnh MySQL mới: GRANT và REVOKE để thực hiện các tác vụ này.
Trong một số trường hợp, chẳng hạn như do sự cố nguồn điện, cơ sở dữ liệu MySQL có thể bị hỏng. Những hư hỏng như vậy không phải lúc nào cũng có nghĩa là phải sử dụng bản sao lưu để phục hồi. Chúng ta sẽ học cách sử dụng tính năng kiểm tra và sửa chữa cơ sở dữ liệu MySQL để giải quyết lỗi cơ sở dữ liệu đơn giản.
Tại sao sao lưu chuẩn lại không đủ.
Giống như máy chủ Web, hầu hết máy chủ MySQL phải luôn trực tuyến. Điều này làm cho việc sao lưu cơ sở dữ liệu MySQL trở nên rất quan trọng. Do dịch vụ MySQL sử dụng bộ nhớ đệm và bộ nhớ đệm để cải thiện hiệu quả cập nhật các tệp cơ sở dữ liệu được lưu trữ trên đĩa nên nội dung của các tệp có thể không hoàn toàn nhất quán với nội dung cơ sở dữ liệu hiện tại. Các thủ tục sao lưu chuẩn chỉ bao gồm việc sao chép các tệp hệ thống và dữ liệu. Loại sao lưu tệp dữ liệu MySQL này không đáp ứng đầy đủ nhu cầu của chúng tôi vì chúng không thể đảm bảo rằng các tệp đã sao chép có thể được sử dụng bình thường trong trường hợp hệ thống bị sập.
Hơn nữa, vì nhiều cơ sở dữ liệu phải tiếp nhận thông tin trong suốt cả ngày nên các bản sao lưu tiêu chuẩn chỉ có thể cung cấp hình ảnh "chụp nhanh" của dữ liệu cơ sở dữ liệu. Nếu tệp cơ sở dữ liệu MySQL bị hỏng hoặc không khả dụng, thông tin được thêm vào sau lần sao lưu cuối cùng sẽ bị mất. Trong nhiều trường hợp, chẳng hạn như cơ sở dữ liệu của trang web thương mại điện tử xử lý đơn hàng của người dùng, thì tổn thất như vậy là không thể chấp nhận được.
Các công cụ trong MySQL có thể sao lưu dữ liệu theo thời gian thực mà không ảnh hưởng đến hiệu quả của dịch vụ trong quá trình sao lưu. Thật không may, điều này đòi hỏi bạn phải cấu hình một hệ thống sao lưu đặc biệt cho dữ liệu MySQL của mình. Nó không liên quan gì đến bất kỳ kế hoạch sao lưu dữ liệu nào khác mà bạn có thể áp dụng. Tuy nhiên, giống như bất kỳ hệ thống sao lưu tốt nào, công sức bỏ ra sẽ xứng đáng khi bạn thực sự sử dụng nó.
Trong chương này, chúng tôi cung cấp hướng dẫn sử dụng trên máy tính chạy Linux hoặc hệ điều hành dựa trên Unix khác. Nếu bạn sử dụng Windows, phương pháp này về cơ bản cũng giống như vậy, nhưng một số lệnh phải được sửa đổi.
Sử dụng mysqldump để sao lưu cơ sở dữ liệu.
Ngoài mysqld, máy chủ MySQL và mysql (máy khách MySQL), nhiều chương trình hữu ích khác cũng được tạo ra trong quá trình cài đặt. Ví dụ, trước đây chúng ta đã thấy mysqladmin, đây là chương trình chịu trách nhiệm kiểm soát và thu thập thông tin về dịch vụ MySQL đang chạy.
mysqldump là một chương trình tương tự như vậy. Khi chạy, nó sẽ kết nối với máy chủ MySQL (giống như chương trình mysql và ngôn ngữ PHP) và tải xuống toàn bộ nội dung của cơ sở dữ liệu được chỉ định. Sau đó, nó sẽ xuất ra một loạt lệnh SQL CREATE TABLE và lệnh INSERT. Bằng cách chạy các lệnh này trong cơ sở dữ liệu MySQL trống, bạn có thể tạo cơ sở dữ liệu MySQL có cùng nội dung với cơ sở dữ liệu gốc.
Bằng cách chuyển hướng đầu ra của mysqldump vào một tệp, bạn có thể lưu trữ "hình ảnh" cơ sở dữ liệu của mình dưới dạng bản sao lưu. Lệnh sau đây kết nối với máy chủ MySQL đang chạy trên myhost với tư cách là người dùng root có mật khẩu mypass và lưu trữ bản sao lưu của cơ sở dữ liệu có tên dbname trong tệp dbname_backup.sql:
%mysqldump -hmyhost -uroot -pmypassdbname>dbname_backup.sql .
Để khôi phục cơ sở dữ liệu như vậy, chỉ cần chạy lệnh sau:
%mysqladmin-hmyhost-uroot-pmypasscreatedbname .
%mysql-hmyhost-uroot-pmypassdbname .
Lệnh đầu tiên sử dụng chương trình mysqladmin để tạo cơ sở dữ liệu. Lệnh thứ hai kết nối với máy chủ MySQL và sử dụng chương trình mysql thông thường, truyền tệp sao lưu làm lệnh cần thực thi.
Theo cách này, chúng ta có thể sử dụng mysqldump để tạo bản sao lưu cơ sở dữ liệu của mình. Vì mysqldump tạo bản sao lưu này bằng cách kết nối với máy chủ MySQL nên chắc chắn an toàn hơn so với việc truy cập trực tiếp vào các tệp cơ sở dữ liệu trong thư mục dữ liệu MySQL, vì bản sao lưu như vậy có thể đảm bảo rằng đó là bản sao hợp lệ của cơ sở dữ liệu, chứ không chỉ là bản sao của các tệp cơ sở dữ liệu.
Vấn đề còn lại là làm sao giải quyết được vấn đề đồng bộ hóa giữa "bản sao" này và cơ sở dữ liệu liên tục được cập nhật. Để thực hiện việc này, bạn cần yêu cầu dịch vụ lưu nhật ký thay đổi.
Sao lưu gia tăng bằng cách sử dụng nhật ký thay đổi.
Như đã đề cập trước đó, trong nhiều trường hợp, cơ sở dữ liệu MySQL mà chúng ta sử dụng sẽ gây mất dữ liệu - đôi khi ngay cả dữ liệu rất quan trọng cũng bị mất. Trong trường hợp như vậy, chúng ta phải tìm cách giữ bản sao lưu đã thực hiện bằng mysqldump bằng phương pháp được mô tả ở trên đồng bộ với cơ sở dữ liệu hiện tại. Giải pháp là sử dụng dịch vụ MySQL để duy trì nhật ký cập nhật. Nhật ký cập nhật là bản ghi tất cả các truy vấn mà cơ sở dữ liệu nhận được có thể thay đổi nội dung cơ sở dữ liệu. Điều này sẽ bao gồm các câu lệnh INSERT, UPDATE và CREATE TABLE, nhưng không bao gồm các câu lệnh SELECT.
Ý tưởng chung là duy trì nhật ký về các thay đổi để khi cơ sở dữ liệu gặp sự cố, quy trình phục hồi của bạn sẽ như sau: đầu tiên sử dụng bản sao lưu (được tạo bằng lệnh mysqldump), sau đó sử dụng nhật ký về các thay đổi sau khi sao lưu.
Bạn cũng có thể sử dụng nhật ký thay đổi để hoàn tác lỗi. Ví dụ, nếu một cộng tác viên cho bạn biết rằng anh ta đã vô tình sử dụng lệnh DROPTABLE, bạn có thể chỉnh sửa nhật ký thay đổi để xóa lệnh đó, sau đó khôi phục bằng bản sao lưu và nhật ký thay đổi đã sửa đổi. Bằng cách này, bạn thậm chí có thể giữ lại những thay đổi ở các bảng khác sau khi xảy ra tai nạn. Để phòng ngừa, bạn cũng có thể muốn thu hồi quyền DROP khỏi những người cộng tác với mình (bạn sẽ thấy cách thực hiện việc này trong phần tiếp theo).
Việc yêu cầu máy chủ MySQL duy trì nhật ký thay đổi rất đơn giản. Bạn chỉ cần thêm một tùy chọn duy nhất vào dòng lệnh của máy chủ:
%safe-mysqld --log-update=cập nhật .
Lệnh trên khởi động dịch vụ MySQL và yêu cầu nó tạo các tệp có tên update.001, update.002, v.v. trong thư mục dữ liệu của máy chủ (nếu bạn cấu hình máy chủ theo hướng dẫn trong Chương 1, thư mục này sẽ là /usr/local/mysql/var). Một tệp mới như vậy sẽ được tạo mỗi lần máy chủ xóa các tệp nhật ký (thường là mỗi lần khởi động lại dịch vụ). Nếu bạn muốn lưu trữ nhật ký thay đổi ở nơi khác (thường thì đây là một ý tưởng hay - nếu đĩa chứa thư mục dữ liệu của bạn bị lỗi, bạn chắc chắn không thể tin tưởng vào nó để lưu trữ bản sao lưu!), bạn có thể chỉ định đường dẫn đến nhật ký thay đổi.
Tuy nhiên, nếu máy chủ MySQL của bạn chạy liên tục, bạn có thể cần phải cấu hình hệ thống khi khởi động dịch vụ MySQL. Trong trường hợp này, việc thêm tùy chọn dòng lệnh có thể trở nên khó khăn. Một cách dễ dàng khác để thiết lập nhật ký thay đổi là thêm tùy chọn tương ứng vào tệp cấu hình MySQL.
Nếu bạn vẫn chưa rõ tệp cấu hình MySQL là gì, đừng lo lắng. Trên thực tế, chúng tôi chưa bao giờ sử dụng tệp cấu hình như vậy trước đây. Để tạo tệp này, hãy đăng nhập vào Linux với tư cách là người dùng MySQL mà chúng ta đã tạo ở Chương 1 (nếu bạn làm theo hướng dẫn chính xác, thì tệp này sẽ là mysqlusr). Sử dụng trình soạn thảo văn bản yêu thích của bạn, tạo một tệp có tên my.cnf trong thư mục dữ liệu MySQL (trừ khi bạn chọn cài đặt MySQL ở nơi khác, tệp này phải là /usr/local/mysql/var). Trong tệp này, nhập dòng sau:
[mysqld]log-update=/usr/backups/mysql/update .
Tất nhiên, bạn có quyền chỉ định nơi ghi tệp nhật ký của mình. Lưu tệp này và khởi động lại dịch vụ MySQL của bạn. Từ bây giờ, máy chủ MySQL sẽ hoạt động như thể bạn đã sử dụng tùy chọn --log-update trên dòng lệnh.
Rõ ràng, đối với một dịch vụ, nhật ký thay đổi có thể chiếm rất nhiều dung lượng. Vì lý do này và vì MySQL không thể tự động xóa các tệp nhật ký cũ khi tạo tệp mới, nên bạn cần tự quản lý các tệp nhật ký thay đổi của mình. Ví dụ, tập lệnh shell Unix sau đây sẽ xóa tất cả các tệp nhật ký thay đổi đã được sửa đổi hơn một tuần trước và sau đó yêu cầu MySQL xóa các tệp nhật ký của nó.
#!/thùng/sh .
tìm /usr/backups/mysql/ -name "update.[0-9]*" .
-typef -mtime+6|xargsrm -f .
/usr/local/mysql/bin/mysqladmin-uroot .
-ppasswordflush-nhật ký.
Nếu tệp nhật ký hiện tại bị xóa, bước cuối cùng (xóa tệp nhật ký) sẽ tạo một nhật ký thay đổi mới, điều này có nghĩa là dịch vụ MySQL đã trực tuyến và không nhận được bất kỳ truy vấn nào làm thay đổi nội dung cơ sở dữ liệu trong tuần qua.
Nếu bạn là người dùng có kinh nghiệm, việc sử dụng "clock daemon" để thiết lập một tập lệnh sao lưu cơ sở dữ liệu thường xuyên (ví dụ, một lần một tuần) và xóa các nhật ký thay đổi cũ sẽ khá đơn giản. Nếu bạn cần thêm trợ giúp, hãy hỏi chuyên gia Unix tại địa phương. Chương Quản trị MySQL trong 'MySQL' của Paul DuBois cũng có hướng dẫn chi tiết về cách thiết lập một hệ thống như vậy.
Giả sử bạn có bản sao lưu và bản sao nhật ký ghi lại những thay đổi kể từ đó, việc khôi phục cơ sở dữ liệu của bạn sẽ rất đơn giản. Nhập bản sao lưu bằng phương pháp chúng ta đã thảo luận ở phần trước sau khi thiết lập cơ sở dữ liệu trống, sau đó nhập nhật ký thay đổi bằng lệnh mysql với tùy chọn dòng lệnh --one-database. Lệnh này hướng dẫn máy chủ chỉ chạy các truy vấn từ nhật ký thay đổi có liên quan đến cơ sở dữ liệu mà chúng ta muốn khôi phục (trong trường hợp này là dbname):
%mysql-uroot-ppassword--one-databasedbname .
%mysql-uroot-ppassword--one-databasedbname .
... .
Kiểm soát truy cập MySQL.
Trước đó trong hướng dẫn này, chúng tôi đã đề cập đến một cơ sở dữ liệu có tên là mysql. Cơ sở dữ liệu này được bao gồm trong mọi máy chủ MySQL và được sử dụng để lưu trữ thông tin về người dùng, mật khẩu và quyền của họ. Tuy nhiên, trước đó, chúng ta đã đăng nhập vào dịch vụ MySQL với tư cách là người dùng root, người có quyền truy cập vào tất cả cơ sở dữ liệu và bảng.
Nếu máy chủ MySQL của bạn chỉ được truy cập thông qua PHP và bạn cẩn thận khi tiết lộ mật khẩu của người dùng root cho bất kỳ ai, thì tài khoản root có thể là đủ. Tuy nhiên, nếu một dịch vụ MySQL được nhiều người chia sẻ (ví dụ, một máy chủ web muốn cung cấp cùng một dịch vụ MySQL cho mỗi người dùng của mình), điều quan trọng là phải thiết lập quyền truy cập phù hợp cho những người dùng khác nhau.
Hệ thống kiểm soát truy cập của MySQL được mô tả chi tiết trong Chương 6 của Sổ tay tham khảo MySQL. Về nguyên tắc, quyền truy cập của người dùng được quản lý bởi năm bảng dữ liệu trong cơ sở dữ liệu MySQL: user, db, host, tables_priv và columns_priv. Nếu bạn muốn chỉnh sửa trực tiếp các bảng này bằng các câu lệnh INSERT, UPDATE và DELETE, tôi khuyên bạn nên đọc chương có liên quan trong Hướng dẫn MySQL trước. Bắt đầu từ phiên bản 3.22.11, MySQL cung cấp một cách đơn giản để quản lý quyền truy cập của người dùng. Bằng cách sử dụng các lệnh không chuẩn GRANT và REVOKE do MySQL cung cấp, bạn có thể tạo người dùng và cấp cho họ các quyền tương ứng mà không cần phải lo lắng về cách chúng được lưu trữ trong năm bảng được đề cập ở trên.
Sử dụng GRANT.
Lệnh GRANT được sử dụng để tạo người dùng mới, chỉ định mật khẩu người dùng và tăng quyền cho người dùng. Định dạng của nó như sau:
mysql>CẤP QUYỀN.
->ĐẾN [ĐƯỢC XÁC ĐỊNH BỞI" "] .
->[VỚI GIẢI THƯỞNG],
Như bạn thấy, có rất nhiều thông tin cần điền vào lệnh này. Chúng ta hãy cùng tìm hiểu từng phương pháp này và cuối cùng đưa ra một số ví dụ để bạn hiểu rõ hơn về cách chúng hoạt động cùng nhau.
là danh sách các quyền được phân tách bằng dấu phẩy mà bạn muốn cấp. Các quyền bạn có thể chỉ định có thể được chia thành ba loại:
Quyền cơ sở dữ liệu/bảng/cột:
ALTER: Sửa đổi các bảng hiện có (chẳng hạn như thêm/xóa cột) và chỉ mục.
TẠO: Tạo cơ sở dữ liệu hoặc bảng mới.
DELETE: Xóa bản ghi khỏi bảng.
DROP: Xóa bảng hoặc cơ sở dữ liệu.
INDEX: Tạo hoặc xóa một chỉ mục.
INSERT: Thêm bản ghi vào bảng.
CHỌN: Hiển thị/tìm kiếm bản ghi trong bảng.
CẬP NHẬT: Sửa đổi các bản ghi hiện có trong bảng.
Quyền quản lý toàn cầu:
FILE: Đọc và ghi các tệp trên máy chủ MySQL.
QUY TRÌNH: Hiển thị hoặc hủy các luồng dịch vụ thuộc về người dùng khác.
TẢI LẠI: Tải lại danh sách kiểm soát truy cập, làm mới nhật ký, v.v.
SHUTDOWN: Tắt dịch vụ MySQL.
Quyền đặc biệt:
TẤT CẢ: Cho phép bạn làm bất cứ điều gì (giống như root).
SỬ DỤNG: Chỉ được phép đăng nhập - không được phép thực hiện bất kỳ thao tác nào khác.
Các quyền này liên quan đến các tính năng của MySQL, một số trong đó chúng ta chưa thấy, nhưng hầu hết thì bạn đều đã quen thuộc.
Xác định khu vực mà các quyền này áp dụng. *.* có nghĩa là quyền này có hiệu lực đối với tất cả cơ sở dữ liệu và bảng. dbName.* có nghĩa là nó hợp lệ với tất cả các bảng trong cơ sở dữ liệu có tên dbName. dbName.tblName có nghĩa là nó chỉ hợp lệ đối với bảng có tên tblName trong dbName. Bạn thậm chí có thể chỉ định rằng quyền chỉ áp dụng cho các cột đó bằng cách sử dụng danh sách các cột trong dấu ngoặc đơn sau khi quyền được cấp (chúng ta sẽ xem ví dụ về điều này sau).
Chỉ định những người dùng mà những quyền này có thể áp dụng. Trong MySQL, người dùng được xác định bằng tên người dùng khi đăng nhập và tên máy chủ/địa chỉ IP của máy tính mà người dùng đang sử dụng. Cả hai giá trị đều có thể sử dụng ký tự đại diện % (ví dụ: kevin@% sẽ cho phép người dùng có tên người dùng là kevin đăng nhập từ bất kỳ máy nào có quyền mà bạn chỉ định).
Chỉ định mật khẩu mà người dùng sử dụng để kết nối với dịch vụ MySQL. Nó được đặt trong dấu ngoặc vuông để chỉ ra rằng IDENTIFIEDBY" " là tùy chọn trong lệnh GRANT. Mật khẩu được chỉ định ở đây sẽ thay thế mật khẩu ban đầu của người dùng. Nếu không chỉ định mật khẩu cho người dùng mới, người dùng đó sẽ không bị yêu cầu nhập mật khẩu khi kết nối.
Phần WITHGRANTOPTION tùy chọn của lệnh này chỉ định rằng người dùng có thể cấp các đặc quyền mà mình có cho những người dùng khác bằng lệnh GRANT/REVOKE. Vui lòng sử dụng tính năng này một cách thận trọng - nó có thể không rõ ràng! Ví dụ, hai người dùng đều có tính năng này có thể chia sẻ quyền của họ với nhau, điều này có thể không phải là điều bạn muốn.
Chúng ta hãy xem xét hai ví dụ. Tạo một người dùng có tên dbmanager có thể kết nối tới MySQL từ server.host.net bằng mật khẩu managedb và có thể truy cập toàn bộ nội dung của cơ sở dữ liệu có tên db (và có thể cấp quyền này cho những người dùng khác). Có thể thực hiện việc này bằng lệnh GRANT sau:
mysql>GRANTALLONdb.* .
->TOdbmanager@server.host.net .
->ĐƯỢC XÁC ĐỊNH BỞI "managedb".
->VỚI GRANTOPTION,
Bây giờ hãy đổi mật khẩu của người dùng này thành funkychicken. Định dạng lệnh như sau:
mysql>GRANTUSAGEON*.* .
->TOdbmanager@server.host.net .
->ĐƯỢC XÁC ĐỊNH BỞI "funkychicken",
Xin lưu ý rằng chúng tôi không cấp bất kỳ quyền bổ sung nào (quyền SỬ DỤNG chỉ cho phép người dùng đăng nhập), nhưng các quyền hiện tại của người dùng sẽ không bị thay đổi.
Bây giờ chúng ta hãy tạo một người dùng mới tên là jessica, người này có thể kết nối với MySQL từ bất kỳ máy nào trong miền host.net. Anh ta có thể cập nhật tên và địa chỉ email của người dùng trong cơ sở dữ liệu mà không cần tra cứu thông tin trong các cơ sở dữ liệu khác. Nghĩa là, anh ta có quyền chỉ đọc trên cơ sở dữ liệu db (ví dụ: SELECT), nhưng anh ta có thể thực hiện các hoạt động CẬP NHẬT trên các cột tên và email của bảng Người dùng. Lệnh như sau:
mysql>GRANTSELECTONdb.* .
->TÔIjessica@%.host.net .
->ĐƯỢC XÁC ĐỊNH BỞI "jessrules",
mysql>GRANTUPDATE(tên,email)ONdb.Users .
->TÔIjessica@%.host.net,
Lưu ý trong lệnh đầu tiên, chúng ta đã sử dụng ký hiệu % (ký tự đại diện) khi chỉ định tên máy chủ mà Jessica có thể sử dụng để kết nối. Hơn nữa, chúng tôi không cấp cho anh ta khả năng chuyển quyền của mình cho người dùng khác vì chúng tôi không đặt WITHGRANTOPTION vào cuối lệnh. Lệnh thứ hai trình bày cách cấp quyền cho các cột cụ thể bằng cách chỉ định danh sách các cột được phân tách bằng dấu phẩy trong ngoặc đơn theo sau các quyền được cấp.
Sử dụng REVOKE.
Như bạn có thể mong đợi, lệnh REVOKE được sử dụng để xóa các đặc quyền đã được cấp trước đó cho người dùng. Cú pháp lệnh như sau:
mysql>HỦY BỎ [( )] .
->TRÊN TỪ ,
Chức năng của các phần khác nhau trong lệnh này giống như trong lệnh GRANT ở trên. Để xóa quyền DROP khỏi cộng tác viên của Jessica (ví dụ, nếu anh ta thường xuyên xóa nhầm cơ sở dữ liệu và bảng), bạn có thể sử dụng lệnh sau:
mysql>REVOKEDROPON*.*FROMidiot@%.host.net,
Xóa quyền đăng nhập của người dùng có lẽ là điều duy nhất mà REVOKE không thể thực hiện. REVOKEALLON*.* sẽ xóa mọi quyền của người dùng, nhưng người dùng vẫn có thể đăng nhập. Để xóa hoàn toàn một người dùng, bạn cần xóa bản ghi tương ứng trong bảng người dùng:
mysql>XÓA TỪ người dùng.
->WHEREUser="idiot"ANDHost="%.host.net",
Mẹo kiểm soát truy cập.
Do cách thức hoạt động của hệ thống kiểm soát truy cập trong MySQL, có hai tính năng bạn phải biết trước khi thiết lập người dùng.
Khi tạo người dùng chỉ có thể đăng nhập vào dịch vụ MySQL từ máy tính đang chạy dịch vụ MySQL (tức là bạn cần họ telnet vào máy chủ và chạy chương trình máy khách MySQL tại đó hoặc sử dụng ngôn ngữ kịch bản phía máy chủ như PHP để giao tiếp), bạn có thể tự hỏi mình nên điền gì vào phần lệnh GRANT. Nếu dịch vụ đang chạy trên www.host.net. Bạn nên đặt người dùng thành username@www.host.net hay username@localhost?
Câu trả lời là bạn không thể dựa vào bất kỳ cái nào trong số chúng để xử lý bất kỳ kết nối nào. Về mặt lý thuyết, nếu người dùng chỉ định tên máy chủ khi kết nối (sử dụng máy khách mysql hoặc sử dụng hàm mysql_connect của PHP), thì tên máy chủ này phải khớp với bản ghi trong hệ thống kiểm soát truy cập. Nhưng vì bạn có thể không muốn buộc người dùng phải chỉ định tên máy chủ (trên thực tế, người dùng máy khách mysql có thể sẽ không chỉ định tên máy chủ nào cả), nên tốt hơn hết bạn nên sử dụng giải pháp thay thế sau.
Đối với những tình huống mà người dùng cần có thể kết nối với MySQL từ máy mà dịch vụ MySQL đang chạy, hãy tạo hai bản ghi người dùng trong hệ thống kiểm soát truy cập MySQL: một bản ghi sử dụng tên máy chủ thực tế (ví dụ: username@www.host.net) và một bản ghi khác sử dụng localhost (ví dụ: username@localhost). Tất nhiên, bạn cần cấp/thu hồi tất cả các quyền cho cả hai người dùng riêng biệt.
Một vấn đề phổ biến khác mà người quản trị MySQL gặp phải là bản ghi người dùng có sử dụng ký tự đại diện trong tên máy chủ (ví dụ: jessica@%.host.net đã đề cập trước đó) sẽ không hoạt động. Điều này thường xảy ra do vấn đề về mức độ ưu tiên của bản ghi trong hệ thống kiểm soát truy cập MySQL. Cụ thể hơn, tên máy chủ cụ thể hơn sẽ được ưu tiên (ví dụ: www.host.net là tên máy chủ cụ thể nhất, %.host.net có phần cụ thể hơn và % là tên máy chủ ít cụ thể nhất).
Sau khi cài đặt mới, hệ thống kiểm soát truy cập MySQL bao gồm hai bản ghi người dùng ẩn danh (cho phép kết nối bằng bất kỳ tên người dùng nào trên máy chủ hiện tại - hai bản ghi này hỗ trợ kết nối từ máy chủ cục bộ và từ tên máy chủ được triển khai của máy chủ) và hai thư mục người dùng gốc. Tình huống chúng ta thảo luận ở trên xảy ra vì thư mục người dùng ẩn danh được ưu tiên hơn bản ghi mới của chúng ta vì tên máy chủ của họ cụ thể hơn.
Hãy xem nội dung của bảng người dùng trên www.host.net, giả sử rằng hồ sơ của Jessica đã được thêm vào. Các hàng được sắp xếp theo mức độ ưu tiên mà máy chủ MySQL sử dụng khi xác nhận kết nối:
Như bạn có thể thấy, vì bản ghi của Jessica có tên máy chủ ít cụ thể nhất nên nó có mức độ ưu tiên thấp nhất. Khi Jessica cố gắng kết nối từ www.host.net, máy chủ MySQL sẽ khớp kết nối của cô ấy với một bản ghi người dùng ẩn danh (giá trị Người dùng trống sẽ khớp với bất kỳ ai). Vì những bản ghi ẩn danh này không yêu cầu mật khẩu và có thể Jessica đã nhập mật khẩu của mình nên MySQL sẽ từ chối kết nối. Ngay cả khi Jessica không nhập mật khẩu, cô ấy cũng chỉ được cấp các quyền (rất hạn chế) của người dùng ẩn danh, chứ không phải các quyền mà cô ấy được cấp ban đầu.
Để giải quyết vấn đề này, bạn có thể xóa bản ghi cho người dùng ẩn danh (XÓA TỪ người dùng WHERE Người dùng = "") hoặc chỉ định hai bản ghi cho tất cả người dùng có thể kết nối từ máy chủ cục bộ (ví dụ: liên quan đến máy chủ cục bộ và liên quan đến tên máy chủ thực tế của máy chủ):
Vì việc duy trì ba hồ sơ người dùng (và ba bộ quyền) cho mỗi người dùng có thể rất phức tạp, chúng tôi khuyên bạn nên xóa những người dùng ẩn danh trừ khi bạn cần sử dụng họ cho một ứng dụng đặc biệt:
Bị khóa ngoài?
Giống như việc làm mất chìa khóa xe hơi, việc quên mật khẩu sau khi bạn đã dành một giờ để cài đặt và gỡ lỗi máy chủ MySQL mới thực sự là một điều phiền toái. May mắn thay, nếu bạn có quyền truy cập root vào máy tính đang chạy MySQL hoặc nếu bạn có thể đăng nhập với tư cách là người dùng chạy dịch vụ MySQL (nếu bạn làm theo hướng dẫn trong Chương 1, thì đây là mysqlusr), thì sẽ không có vấn đề gì. Thực hiện theo các bước dưới đây để kiểm soát dịch vụ.
Đầu tiên, bạn phải tắt dịch vụ MySQL. Vì mysqladmin thường được sử dụng yêu cầu mật khẩu bạn đã quên, nên bạn chỉ có thể hoàn tất tác vụ này bằng cách tắt tiến trình dịch vụ. Xác định ID tiến trình của dịch vụ MySQL bằng lệnh ps hoặc bằng cách xem tệp PID của dịch vụ (trong thư mục dữ liệu MySQL), sau đó kết thúc dịch vụ đó bằng lệnh sau:
%giết .
Đây là ID tiến trình của dịch vụ MySQL. Thao tác này sẽ chấm dứt dịch vụ. Không sử dụng kill -9 trừ khi thực sự cần thiết vì lệnh này có thể làm hỏng tệp bảng của bạn. Nếu bạn buộc phải làm vậy, đây là cách kiểm tra và sửa chữa các tệp đó.
Sau khi tắt dịch vụ, bạn có thể khởi động lại dịch vụ bằng cách chạy safe-mysqld (sử dụng mysqld hoặc mysqld-nt trên Windows) với tùy chọn dòng lệnh --skip-grant-tables. Điều này sẽ hướng dẫn máy chủ MySQL cho phép truy cập không bị hạn chế. Rõ ràng, chúng ta chỉ nên chạy máy chủ ở chế độ này trong thời gian ngắn nhất có thể để tránh các rủi ro bảo mật vốn có.
Sau khi kết nối thành công, hãy thay đổi mật khẩu root của bạn:
mysql>USEmysql,
mysql>UPDATEuserSETPassword=PASSWORD("mật khẩu mới") .
->WHEREUser="gốc",
Cuối cùng, ngắt kết nối và hướng dẫn máy chủ MySQL tải lại bảng cấp quyền để nhận mật khẩu mới:
%mysqladminflush-quyền-quyền.
Bây giờ mọi chuyện đã ổn rồi - sẽ không ai biết bạn đã làm gì nữa. Giống như bạn để quên chìa khóa trong xe nhưng bạn vẫn ở trong xe vậy.
Kiểm tra và sửa chữa các tệp dữ liệu MySQL.
Mất điện tạm thời, tắt tiến trình dịch vụ MySQL bằng lệnh kill -9 hoặc một lỗi khác do người bạn idiot@%.host.net của Jessica gây ra đều có thể làm hỏng các tệp dữ liệu MySQL. Nếu dịch vụ đang trong quá trình thay đổi tệp thì bị gián đoạn, các tệp có thể ở trạng thái sai hoặc không nhất quán. Vì những hư hỏng như vậy đôi khi không dễ phát hiện nên có thể phải rất lâu sau bạn mới phát hiện ra lỗi. Vì vậy, khi bạn phát hiện ra vấn đề này, có thể tất cả các bản sao lưu đều có cùng một lỗi.
Chương 15 của Sổ tay tham khảo MySQL mô tả chức năng của tiện ích myisamchk đi kèm với MySQL và cách sử dụng tiện ích này để kiểm tra và sửa chữa các tệp dữ liệu MySQL của bạn. Mặc dù chương này được khuyến nghị đọc cho bất kỳ ai muốn xây dựng một máy chủ MySQL mạnh mẽ, nhưng vẫn cần phải thảo luận về những điểm chính ở đây.
Trước khi tiến hành, bạn phải biết rằng chương trình myisamchk phải có quyền truy cập độc quyền vào các tệp dữ liệu MySQL mà nó sử dụng để kiểm tra và sửa đổi chúng. Nếu dịch vụ MySQL đang sử dụng một tệp và sửa đổi tệp mà myisamchk đang kiểm tra, myisamchk sẽ nhầm tưởng rằng đã xảy ra lỗi và sẽ cố gắng sửa lỗi - điều này sẽ khiến dịch vụ MySQL bị sập! Theo cách này, để tránh tình huống này, chúng ta thường cần tắt dịch vụ MySQL trong khi làm việc. Ngoài ra, bạn có thể tạm thời tắt máy chủ để tạo bản sao của tệp và sau đó làm việc trên bản sao đó. Khi hoàn tất, hãy tắt máy chủ và thay thế tệp cũ bằng tệp mới (bạn cũng có thể muốn lưu lại nhật ký về những thay đổi mình đã thực hiện trong quá trình này).
Thư mục dữ liệu MySQL không quá khó hiểu. Mỗi cơ sở dữ liệu tương ứng với một thư mục con và mỗi thư mục con chứa các tệp tương ứng với các bảng dữ liệu trong cơ sở dữ liệu này. Mỗi bảng dữ liệu tương ứng với ba tệp có cùng tên với bảng nhưng có phần mở rộng khác nhau. Tệp tblName.frm là định nghĩa bảng, lưu trữ nội dung và loại cột dữ liệu có trong bảng. Tệp tblName.MYD chứa dữ liệu trong bảng. Tệp tblName.MYI chứa các chỉ mục cho bảng (ví dụ: tệp này có thể chứa các bảng tra cứu để giúp cải thiện các truy vấn trên các cột khóa chính của bảng).
Để kiểm tra lỗi của bảng, chỉ cần chạy myisamchk (trong thư mục bin của MySQL) và cung cấp vị trí tệp và tên bảng hoặc tên của chỉ mục trên bảng:
%myisamchk /usr/local/mysql/var/dbName/tblName .
%myisamchk/usr/local/mysql/var/dbName/tblName.MYI .
Cả hai lệnh trên đều có thể thực hiện kiểm tra trên bảng được chỉ định. Để kiểm tra tất cả các bảng trong cơ sở dữ liệu, bạn có thể sử dụng ký tự đại diện:
%myisamchk/usr/local/mysql/var/dbName/*.MYI .
Để kiểm tra tất cả các bảng trong mọi cơ sở dữ liệu, bạn có thể sử dụng hai ký tự đại diện:
%myisamchk/usr/local/mysql/var/*/*.MYI .
Nếu không có tùy chọn nào, myisamchk sẽ thực hiện kiểm tra bình thường các tệp bảng. Nếu bạn có nghi ngờ về một bảng nào đó, nhưng kiểm tra thông thường không phát hiện ra điều gì sai, bạn có thể thực hiện kiểm tra kỹ hơn (nhưng chậm hơn!) bằng cách sử dụng tùy chọn --extend-check:
%myisamchk --extend-check /đường dẫn/đến/tblName .
Kiểm tra lỗi không mang tính phá hủy, nghĩa là bạn không phải lo lắng về việc làm cho các vấn đề hiện có trở nên tồi tệ hơn bằng cách chạy kiểm tra trên các tệp dữ liệu của mình. Mặt khác, tùy chọn Sửa chữa tuy nhìn chung an toàn nhưng lại gây ra những thay đổi không thể đảo ngược đối với các tệp dữ liệu của bạn. Vì lý do này, chúng tôi đặc biệt khuyên bạn nên sao lưu trước khi cố gắng sửa tệp bảng bị hỏng và đảm bảo rằng máy chủ MySQL của bạn đã tắt trước khi thực hiện sao lưu.
Khi bạn cố gắng sửa chữa sự cố bảng bị hỏng, có ba loại sửa chữa. Nếu bạn nhận được thông báo lỗi cho biết không thể tạo tệp tạm thời, hãy xóa tệp được thông báo và thử lại - đây thường là dữ liệu còn sót lại từ thao tác sửa chữa trước đó.
Ba phương pháp sửa chữa như sau:
Phương pháp đầu tiên là nhanh nhất và được dùng để khắc phục những sự cố phổ biến nhất, trong khi phương pháp cuối cùng là chậm nhất và được dùng để khắc phục những sự cố không thể khắc phục bằng các phương pháp khác.
Kiểm tra và sửa chữa các tệp dữ liệu MySQL.
Nếu các phương pháp trên không sửa được bảng bị hỏng, trước khi bỏ cuộc, bạn có thể thử hai mẹo sau:
Nếu bạn nghi ngờ có lỗi không thể khắc phục được xảy ra trong tệp chỉ mục của bảng (*.MYI) hoặc thậm chí tệp đã bị mất, bạn có thể tạo lại tệp đó bằng tệp dữ liệu (*.MYD) và tệp định dạng dữ liệu (*.frm). Đầu tiên hãy tạo một bản sao của tệp dữ liệu (tblName.MYD). Khởi động lại dịch vụ MySQL của bạn và kết nối với nó, sau đó xóa nội dung bảng bằng lệnh sau:
mysql>XÓA TỪ tblName,
Khi nội dung của bảng bị xóa, một tệp chỉ mục mới sẽ được tạo. Đăng xuất và tắt dịch vụ lần nữa, sau đó ghi đè tệp dữ liệu mới (trống) bằng tệp dữ liệu bạn vừa lưu (tblName.MYD). Cuối cùng, sử dụng myisamchk để thực hiện sửa chữa tiêu chuẩn (phương pháp thứ hai ở trên) để xây dựng lại dữ liệu chỉ mục dựa trên nội dung của dữ liệu bảng và tệp định dạng bảng.
Nếu tệp định dạng của bảng (tblName.frm) bị mất hoặc có lỗi không thể khắc phục được nhưng bạn biết cách sử dụng câu lệnh CREATE TABLE tương ứng để tạo lại bảng, bạn có thể tạo lại tệp .frm mới và sử dụng tệp đó với tệp dữ liệu và tệp chỉ mục của mình (nếu có vấn đề với tệp chỉ mục, hãy sử dụng phương pháp trên để xây dựng lại tệp mới). Trước tiên hãy tạo một bản sao của các tệp dữ liệu và chỉ mục, sau đó xóa các tệp gốc (xóa tất cả các bản ghi liên quan đến bảng này trong thư mục dữ liệu).
Khởi động dịch vụ MySQL và tạo một bảng mới bằng cách sử dụng tệp CREATE TABLE ban đầu. Tệp .frm mới sẽ hoạt động tốt, nhưng tốt hơn hết bạn nên thực hiện sửa chữa tiêu chuẩn (phương pháp 2 ở trên).
Phần kết luận.
Được rồi, đúng là chương này không có nhiều mã mà chúng ta thường sử dụng để có thể thực hiện một số công việc thực tế. Nhưng tất cả công việc này—sao lưu và khôi phục cơ sở dữ liệu, quản lý hệ thống kiểm soát truy cập của MySQL, kiểm tra và sửa chữa các bảng—sẽ giúp bạn xây dựng một máy chủ cơ sở dữ liệu MySQL có thể tồn tại lâu dài.
Trong chương áp chót của hướng dẫn này, Chương 9, chúng ta sẽ tìm hiểu một số kỹ thuật SQL phức tạp hơn để cho phép máy chủ cơ sở dữ liệu quan hệ thực hiện những điều mà trước đây bạn có thể chưa từng nghĩ tới.
Cuối cùng, bài viết này về quản lý MySQL kết thúc tại đây. Nếu bạn muốn biết thêm về quản lý MySQL, vui lòng tìm kiếm các bài viết trên CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!