MySQL là một hệ quản trị cơ sở dữ liệu quan hệ (DBMS) mã nguồn mở thường được triển khai trong nhiều loại ngữ cảnh. Thường xuyên nhất, nó được triển khai như một phần của LAMP Stack. Hệ thống cơ sở dữ liệu cũng dễ sử dụng và có tính di động cao và trong bối cảnh của nhiều ứng dụng, cực kỳ hiệu quả. Vì MySQL thường là nơi lưu trữ dữ liệu tập trung cho một lượng lớn dữ liệu quan trọng của sứ mệnh, nên việc sao lưu thường xuyên cơ sở dữ liệu MySQL của bạn là một trong những nhiệm vụ khôi phục thảm họa quan trọng nhất mà quản trị viên hệ thống có thể thực hiện. Hướng dẫn này đề cập đến một số phương pháp riêng biệt để tạo bản sao lưu cơ sở dữ liệu của bạn cũng như khôi phục cơ sở dữ liệu từ bản sao lưu.
Trước khi bắt đầu quá trình cài đặt, chúng tôi cho rằng bạn đã làm theo các bước được nêu trong Thiết lập và Bảo mật Phiên bản Máy tính của chúng tôi. Ngoài ra, bạn sẽ cần cài đặt Cơ sở dữ liệu MySQL. Tất cả cấu hình sẽ được thực hiện trong một phiên đầu cuối; đảm bảo rằng bạn đã đăng nhập vào Linode của mình với tư cách root thông qua SSH. Nếu bạn chưa quen với quản trị máy chủ Linux, bạn có thể quan tâm đến phần giới thiệu về hướng dẫn khái niệm Linux, hướng dẫn dành cho người mới bắt đầu và hướng dẫn cơ bản về quản trị.
Phương pháp sao lưu
Hầu hết các bản sao lưu cơ sở dữ liệu MySQL trong hướng dẫn này được thực hiện bằng cách sử dụng mysqldump
, được phân phối với cài đặt máy chủ MySQL mặc định. Chúng tôi khuyên bạn nên sử dụng mysqldump
bất cứ khi nào có thể vì đây thường là cách dễ nhất và hiệu quả nhất để sao lưu cơ sở dữ liệu. Các phương pháp khác được nêu chi tiết trong hướng dẫn này được cung cấp cho các trường hợp khi bạn không có quyền truy cập vào mysqldump
công cụ, như trong môi trường khôi phục nhưFinnix hoặc trong các tình huống mà phiên bản cục bộ của máy chủ MySQL sẽ không khởi động.
Tuy nhiên, hướng dẫn này chỉ cung cấp một cái nhìn tổng quan về mysqldump
công cụ, vì có nhiều tùy chọn và cách sử dụng mysqldump
nằm ngoài phạm vi của tài liệu này. Chúng tôi khuyến khích bạn làm quen với tất cả các quy trình được đề cập trong tài liệu này và tiếp tục khám phá mysqldump
ngoài các trường hợp được mô tả ở đây. Hãy nhớ lưu ý những điều sau:
-
*.sql
các tệp được tạo bằngmysqldump
có thể được khôi phục bất cứ lúc nào. Bạn thậm chí có thể chỉnh sửa cơ sở dữ liệu.sql
tệp theo cách thủ công (hết sức cẩn thận!) bằng trình soạn thảo văn bản yêu thích của bạn. - Nếu cơ sở dữ liệu của bạn chỉ sử dụng công cụ lưu trữ MyISAM, bạn có thể thay thế bằng
mysqldump
vớimysqlhotcopy
nhanh hơn .
Tạo Bản sao lưu của Toàn bộ Hệ thống Quản lý Cơ sở dữ liệu (DBMS)
Thường cần sao lưu (hoặc “kết xuất”) toàn bộ hệ thống quản lý cơ sở dữ liệu cùng với tất cả các cơ sở dữ liệu và bảng, bao gồm cả cơ sở dữ liệu hệ thống chứa người dùng, quyền và mật khẩu.
Tùy chọn 1:Tạo Bản sao lưu của Toàn bộ Hệ thống Quản lý Cơ sở dữ liệu Sử dụng Tiện ích mysqldump
Phương pháp đơn giản nhất để tạo một bản sao lưu thống nhất của toàn bộ hệ thống quản lý cơ sở dữ liệu MySQL là sử dụng mysqldump
tiện ích từ dòng lệnh. Cú pháp để tạo kết xuất cơ sở dữ liệu với dấu thời gian hiện tại như sau:
mysqldump --all-databases > dump-$( date '+%Y-%m-%d_%H-%M-%S' ).sql -u root -p
Lệnh này sẽ nhắc bạn nhập mật khẩu trước khi bắt đầu sao lưu cơ sở dữ liệu trong thư mục hiện tại. Quá trình này có thể mất từ vài giây đến vài giờ tùy thuộc vào kích thước cơ sở dữ liệu của bạn.
Tự động hóa quy trình này bằng cách thêm một dòng vào crontab
:
0 1 * * * /usr/bin/mysqldump --all-databases > dump-$( date '+%Y-%m-%d_%H-%M-%S' ).sql -u root -pPASSWORD
Đối với ví dụ trên, hãy sử dụng which mysqldump
để xác nhận đường dẫn chính xác đến lệnh và thay thế root
với người dùng mysql mà bạn muốn chạy các bản sao lưu và PASSWORD
với mật khẩu chính xác cho người dùng đó.
Lưu ý Trong ví dụ crontab, hãy đảm bảo rằng không có khoảng trống giữa cờ -P và mục nhập mật khẩu của bạn.
Tùy chọn 2:Tạo Bản sao lưu của Toàn bộ DBMS bằng Bản sao của Thư mục Dữ liệu MySQL
Trong khi mysqldump
công cụ là phương pháp sao lưu ưa thích, có một số trường hợp yêu cầu một cách tiếp cận khác. mysqldump
chỉ hoạt động khi máy chủ cơ sở dữ liệu có thể truy cập và đang chạy. Nếu không thể khởi động cơ sở dữ liệu hoặc không thể truy cập được hệ thống máy chủ, chúng tôi có thể sao chép trực tiếp cơ sở dữ liệu của MySQL. Phương pháp này thường cần thiết trong các tình huống mà bạn chỉ có quyền truy cập vào môi trường khôi phục như Finnix với các đĩa hệ thống của bạn được gắn trong hệ thống tệp đó. Nếu bạn đang thử phương pháp này trên chính hệ thống của mình, hãy đảm bảo rằng cơ sở dữ liệu không chạy bộ. Đưa ra một lệnh tương tự như sau:
/etc/init.d/mysqld stop
Trên hầu hết phiên bản MySQL của bản phân phối, thư mục dữ liệu nằm trong /var/lib/mysql/
danh mục. Nếu thư mục này không tồn tại, hãy kiểm tra /etc/mysql/my.cnf
tệp cho một đường dẫn đến thư mục dữ liệu. Ngoài ra, bạn có thể tìm kiếm thư mục dữ liệu trong hệ thống tệp của mình bằng cách ra lệnh sau:
find / -name mysql
Khi bạn đã định vị được thư mục dữ liệu MySQL của mình, bạn có thể sao chép nó vào một vị trí sao lưu. Ví dụ sau giả định rằng thư mục dữ liệu MySQL nằm tại /var/lib/mysql/
:
cp -R /var/lib/mysql/* /opt/database/backup-1266871069/
Trong trường hợp này, chúng tôi đã sao chép đệ quy nội dung của thư mục dữ liệu (ví dụ:/var/lib/mysql/
) vào một thư mục trong /opt/
phân cấp (ví dụ:/opt/database/backup-1266871069/
). Thư mục này phải tồn tại trước khi bắt đầu thao tác sao chép. Hãy xem xét chuỗi hoạt động sau:
/etc/init.d/mysql stop
mkdir -p /opt/database/backup-1266872202/
cp -R /var/lib/mysql/* /opt/database/backup-1266872202/
Các lệnh này bắt đầu bằng cách dừng daemon máy chủ MySQL, sau đó tạo một thư mục có tên /opt/database/backup-1266872202/
và thực hiện một bản sao đệ quy của thư mục dữ liệu. Lưu ý rằng chúng tôi đã chọn sử dụng backup-[time_t]
quy ước đặt tên cho các ví dụ của chúng tôi. Thay thế các đường dẫn 'ở trên cho tổ chức và lược đồ đặt tên ưa thích của bạn. cp
lệnh không tạo ra kết quả và có thể mất một thời gian để hoàn thành tùy thuộc vào kích thước cơ sở dữ liệu của bạn. Đừng lo lắng nếu phải mất một lúc để hoàn thành. Khi thao tác sao chép kết thúc, bạn có thể muốn lưu trữ thư mục dữ liệu vào một kho lưu trữ “tar” để quản lý và di chuyển giữa các máy dễ dàng hơn. Ban hành các lệnh sau để tạo kho lưu trữ:
cd /opt/database/backup-1266872202
tar -czfv * > /opt/mysqlBackup-1266872202.tar.gz
Sau khi tarball được tạo, bạn có thể dễ dàng chuyển tệp theo cách thuận tiện nhất cho mình. Đừng quên khởi động lại daemon máy chủ MySQL nếu cần:
/etc/init.d/mysql start
Tạo bản sao lưu của một cơ sở dữ liệu duy nhất
Trong nhiều trường hợp, không cần tạo bản sao lưu của toàn bộ máy chủ cơ sở dữ liệu. Trong một số trường hợp, chẳng hạn như nâng cấp ứng dụng web, trình cài đặt có thể khuyên bạn nên sao lưu cơ sở dữ liệu trong trường hợp việc nâng cấp ảnh hưởng xấu đến cơ sở dữ liệu. Tương tự, nếu bạn muốn tạo một "kết xuất" của một cơ sở dữ liệu cụ thể để di chuyển cơ sở dữ liệu đó sang một máy chủ khác, bạn có thể xem xét phương pháp sau.
Khi có thể, hãy sử dụng mysqldump
công cụ để xuất một "kết xuất" của một cơ sở dữ liệu. Lệnh này sẽ giống như sau:
mysqldump -u username -ps3cr1t -h localhost danceLeaders > 1266861650-danceLeaders.sql
Ví dụ trên giống như ví dụ trong phần trước, ngoại trừ việc sử dụng --all-databases
, ví dụ này chỉ định một tên cơ sở dữ liệu cụ thể. Trong trường hợp này, chúng tôi tạo một bản sao lưu của danceLeaders
cơ sở dữ liệu. Hình thức của lệnh này, trong một ký hiệu đơn giản hơn như sau:
mysqldump -u [username] -p[password] -h [host] [databaseName] > [backup-name].sql
Để có thêm một ví dụ, chúng tôi sẽ sao lưu cơ sở dữ liệu có tên customer
sử dụng tài khoản cơ sở dữ liệu gốc bằng cách ra lệnh sau:
mysqldump -u root -p -h localhost customer > customerBackup.sql
Bạn sẽ được nhắc nhập mật khẩu trước mysqldump
bắt đầu quá trình sao lưu của nó. Như mọi khi là tệp sao lưu, trong trường hợp này là customerBackup.sql
, được tạo trong thư mục mà bạn phát hành lệnh này. mysqldump
lệnh có thể hoàn thành trong vài giây hoặc vài giờ tùy thuộc vào kích thước của cơ sở dữ liệu và tải trên máy chủ khi chạy sao lưu.
Tạo bản sao lưu của một bảng duy nhất
Tùy chọn 1:Tạo bản sao lưu của một bảng duy nhất bằng tiện ích mysqldump
Thao tác này, giống như các lần sử dụng mysqldump
trước đây tiện ích trong tài liệu này, cho phép bạn tạo bản sao lưu của một bảng cơ sở dữ liệu duy nhất. Tiếp tục các ví dụ trước đó của chúng tôi, ví dụ sau cho phép bạn sao lưu bảng usernameRecords
trong danceLeaders
cơ sở dữ liệu.
mysqldump -u username -ps3cr1t -h localhost danceLeaders usernameRecords \> 1266861650-danceLeaders-usernameRecords.sql
Ví dụ trên giống như ví dụ trong phần trước, ngoại trừ việc chúng tôi đã thêm đặc tả tên bảng vào lệnh để chỉ định tên bảng mà chúng tôi muốn sao lưu. Hình thức của lệnh này trong một ký hiệu đơn giản hơn như sau:
mysqldump -u [username] -p[password] -h [host] [databaseName] [tableName] > [backup-name].sql
Đối với một ví dụ bổ sung, chúng tôi sẽ sao lưu bảng có tên “đơn đặt hàng” từ cơ sở dữ liệu có tên customer
sử dụng tài khoản cơ sở dữ liệu gốc bằng cách ra lệnh sau:
mysqldump -u root -p -h localhost customer order > customerBackup-order.sql
Bạn sẽ được nhắc nhập mật khẩu trước mysqldump
bắt đầu quá trình sao lưu của nó. Như mọi khi, tệp sao lưu (trong trường hợp này là customerBackup.sql
) được tạo trong thư mục mà bạn phát hành lệnh này. mysqldump
lệnh có thể hoàn thành trong vài giây hoặc vài giờ tùy thuộc vào kích thước của cơ sở dữ liệu và tải trên máy chủ khi chạy sao lưu.
Tùy chọn 2:Tạo bản sao lưu của một bảng bằng MySQL Client và một Tuyên bố OUTFILE
Bản thân máy khách MySQL có một số khả năng sao lưu. Nó hữu ích khi bạn đã đăng nhập và bạn không muốn thoát phiên hiện tại. Nếu bạn đang sử dụng hệ thống trực tiếp và không có đủ thời gian ngừng hoạt động, bạn nên cân nhắc tạm thời khóa bảng mà bạn đang sao lưu.
Xin lưu ý rằng khi sao lưu một bảng bằng máy khách MySQL, cấu trúc của bảng đó không được duy trì trong bản sao lưu. Chỉ bản thân dữ liệu được lưu khi sử dụng phương pháp này.
-
Trước khi bắt đầu, chúng tôi khuyên bạn nên thực hiện
LOCK TABLES
trên các bảng mà bạn định sao lưu, tiếp theo làFLUSH TABLES
để đảm bảo rằng cơ sở dữ liệu ở trong một không gian nhất quán trong quá trình sao lưu. Bạn chỉ cần một khóa đọc. Điều này cho phép các máy khách khác tiếp tục truy vấn các bảng trong khi bạn đang tạo bản sao của các tệp trong thư mục dữ liệu MySQL. Đối với khóa “đọc”, cú pháp củaLOCK TABLES
trông giống như sau:1
LOCK TABLES tableName READ;
Để thực hiện
LOCK TABLES
trênorder
bảng củacustomer
cơ sở dữ liệu, hãy phát hành lệnh sau:mysql -u root -p -h localhost
Sau đó, bạn sẽ được nhắc nhập mật khẩu gốc. Khi bạn đã nhập thông tin đăng nhập cơ sở dữ liệu, bạn sẽ đến lời nhắc máy khách mysql. Đưa ra lệnh sau để khóa
order
trongcustomer
cơ sở dữ liệu (;
theo sau là bắt buộc đối với các lệnh MySQL):1 2 3
USE customer; LOCK TABLES order READ; FLUSH TABLES;
-
Bây giờ chúng ta có thể bắt đầu thao tác sao lưu. Để tạo bản sao lưu của một bảng duy nhất bằng máy khách MySQL, bạn cần phải đăng nhập vào MySQL DBMS của mình. Nếu bạn hiện chưa đăng nhập, bạn có thể đăng nhập bằng lệnh sau:
mysql -u root -p -h localhost
Bạn sẽ được nhắc nhập mật khẩu. Khi bạn đã nhập đúng mật khẩu và ở lời nhắc máy khách MySQL, bạn có thể sử dụng
SELECT * INTO OUTFILE
tuyên bố. Cú pháp của câu lệnh này trông giống như sau:1
SELECT * INTO OUTFILE 'file_name' FROM tbl_name;
Trong ví dụ này, chúng tôi sẽ tạo một bản sao lưu dữ liệu từ
order
bảng củacustomer
cơ sở dữ liệu. Đưa ra lệnh sau để bắt đầu quy trình sao lưu (;
ở cuối là bắt buộc đối với các lệnh MySQL):1 2 3 4 5
USE customer; LOCK TABLES order READ; FLUSH TABLES; SELECT * INTO OUTFILE 'customerOrderBackup.sql' FROM order; UNLOCK TABLES;
customerOrderBackup.sql
tệp sẽ được tạo trong thư mục con dữ liệu thích hợp trong thư mục dữ liệu MySQLs. Thư mục dữ liệu MySQL thường là/var/lib/mysql/
. Trong ví dụ này,OUTFILE
sẽ là/var/lib/mysql/customer/customerOrderBackup.sql
. Tuy nhiên, vị trí của thư mục và tệp này có thể khác nhau giữa các bản phân phối Linux. Nếu bạn không thể tìm thấy tệp sao lưu của mình, bạn có thể tìm kiếm nó bằng lệnh sau:find / -name customerOrderBackup.sql
-
Khi bạn đã hoàn thành thao tác sao lưu, bạn sẽ muốn mở khóa các bảng bằng lệnh sau trong máy khách MySQL. Thao tác này sẽ đưa cơ sở dữ liệu của bạn trở lại hoạt động bình thường. Đăng nhập vào máy khách MySQL bằng lệnh đầu tiên nếu bạn hiện chưa đăng nhập và sau đó sử dụng lệnh thứ hai:
mysql -uroot -p -h localhost
1
UNLOCK TABLES;
Bạn có thể tiếp tục sử dụng cơ sở dữ liệu của mình như bình thường kể từ thời điểm này.
Cân nhắc để có chiến lược sao lưu hiệu quả
Tạo bản sao lưu cơ sở dữ liệu MySQL của bạn nên là một nhiệm vụ thường xuyên và được lên lịch. Bạn có thể muốn cân nhắc việc lập lịch sao lưu định kỳ bằng cron
, mysqldump
và / hoặc mail
. Xem xét tài liệu của chúng tôi để biết thêm thông tin liên quan đến cron. Việc triển khai giải pháp sao lưu tự động có thể giúp giảm thiểu thời gian ngừng hoạt động trong tình huống khôi phục sau thảm họa.
Bạn không cần đăng nhập với quyền root khi sao lưu cơ sở dữ liệu. Người dùng MySQL có quyền đọc (ví dụ:SELECT
) quyền có thể sử dụng cả mysqldump
và mysql
(ví dụ:máy khách MySQL) các công cụ để sao lưu, như được mô tả bên dưới. Theo thông lệ, chúng tôi khuyên bạn không nên sử dụng root
của MySQL người dùng bất cứ khi nào có thể để giảm thiểu rủi ro bảo mật.
Bạn có thể muốn xem xét sao lưu gia tăng như một phần của kế hoạch sao lưu cơ sở dữ liệu dài hạn. Mặc dù quy trình này không được đề cập ở đây, chúng tôi khuyên bạn nên xem xét tài nguyên Phương pháp sao lưu cơ sở dữ liệu MySQL để biết thêm thông tin.
Khôi phục toàn bộ DBMS từ bản sao lưu
Bản sao lưu không thể khôi phục có giá trị tối thiểu. Chúng tôi khuyên bạn nên kiểm tra các bản sao lưu của mình thường xuyên để đảm bảo rằng chúng có thể được khôi phục trong trường hợp bạn có thể cần khôi phục từ các bản sao lưu. Khi sử dụng khôi phục bản sao lưu cơ sở dữ liệu MySQL của bạn, phương pháp bạn sử dụng tùy thuộc vào phương pháp bạn đã sử dụng để tạo bản sao lưu được đề cập.
Tùy chọn 1:Khôi phục Toàn bộ DBMS bằng MySQL Client và Sao lưu do mysqldump tạo
Trước khi bắt đầu quá trình khôi phục, phần này giả định hệ thống của bạn đang chạy phiên bản MySQL mới được cài đặt mà không có bất kỳ cơ sở dữ liệu hoặc bảng nào hiện có. Nếu bạn đã có cơ sở dữ liệu và bảng trong MySQL DBMS của mình, vui lòng sao lưu trước khi tiếp tục vì quá trình này sẽ ghi đè dữ liệu MySQL hiện tại.
Bạn có thể dễ dàng khôi phục toàn bộ DBMS của mình bằng cách sử dụng mysql
yêu cầu. Cú pháp cho điều này sẽ giống như sau:
mysql -u [username] -p [password] < backupFile.sql
Trong trường hợp này, chúng tôi chỉ đơn giản là khôi phục toàn bộ DBMS. Lệnh sẽ giống như sau:
mysql -u root -p < 1266861650-backup-all.sql
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi cung cấp thông tin đăng nhập chính xác, quá trình khôi phục sẽ bắt đầu. Vì quá trình này khôi phục toàn bộ DBMS, nên có thể mất từ vài giây đến nhiều giờ.
Tùy chọn 2:Khôi phục Toàn bộ DBMS Sử dụng Các Tệp Dữ liệu MySQL Được Sao chép Trực tiếp từ Thư mục dữ liệu của MySQL
Trước khi bắt đầu quá trình khôi phục, phần này giả định hệ thống của bạn đang chạy phiên bản MySQL mới được cài đặt mà không có bất kỳ cơ sở dữ liệu hoặc bảng nào hiện có. Nếu bạn đã có cơ sở dữ liệu và bảng trong MySQL DBMS của mình, vui lòng sao lưu trước khi tiếp tục vì quá trình này sẽ ghi đè dữ liệu MySQL hiện tại.
-
Nếu bạn có một bản sao lưu hoàn chỉnh của thư mục dữ liệu MySQL của mình (thường là
/var/lib/mysql
), bạn có thể khôi phục nó từ dòng lệnh. Để đảm bảo khôi phục thành công, trước tiên bạn phải dừng daemon máy chủ MySQL và xóa dữ liệu hiện tại trong thư mục dữ liệu MySQL./etc/init.d/mysql stop rm -R /var/lib/mysql/*
-
Trong ví dụ sau, bản sao lưu thư mục dữ liệu MySQL nằm trong
/opt/database/backup-1266872202
danh mục. Nếu bạn tạo tarball thư mục dữ liệu khi sao lưu thư mục dữ liệu DBMS của mình, bạn sẽ cần giải nén các tệp từ tarball trước khi sao chép bằng các lệnh sau:cp mysqlBackup-1266872202.tar.gz /var/lib/mysql/ cd /var/lib/mysql tar xzvf mysqlBackup-1266872202.tar.gz
-
Trước khi chúng tôi có thể khởi động lại quy trình cơ sở dữ liệu MySQL, chúng tôi phải đảm bảo rằng các quyền được đặt chính xác trên
/var/lib/mysql/
danh mục. Đối với ví dụ này, chúng tôi giả sử daemon máy chủ MySQL chạy khi người dùngmysql
với nhómmysql
. Để thay đổi quyền trên thư mục dữ liệu, hãy sử dụng lệnh sau:chown -R mysql:mysql /var/lib/mysql
-
Thay đổi
mysql:mysql
phần của lệnh này nếu phiên bản MySQL của bạn chạy với các quyền của người dùng và nhóm khác nhau. Hình thức của đối số này là[user]:[group]
. Cuối cùng, chúng ta có thể khởi động daemon máy chủ MySQL bằng lệnh sau:/etc/init.d/mysql start
Nếu bạn gặp lỗi tương tự như sau:
/usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
Bạn sẽ cần tìm
debian-sys-maint
cũ mật khẩu của người dùng trong/etc/mysql/debian.cnf
và sau đó thay đổidebian-sys-maint
mới mật khẩu của người dùng cho nó. Bạn có thể xem mật khẩu cũ bằngcat
:cat /etc/mysql/debian.cnf | grep password
Sao chép (hoặc ghi nhớ) mật khẩu. Sau đó, bạn sẽ cần thay đổi
debian-sys-maint
mới mật khẩu của người dùng. Bạn có thể thực hiện việc này bằng cách đăng nhập với tư cách là người dùng gốc MySQL và đưa ra lệnh sau (trong đólà mật khẩu của debian-sys-maint
cũ người dùng):1
GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '<password>' WITH GRANT OPTION;
-
Sau đó, bạn sẽ cần khởi động lại MySQL bằng lệnh sau:
/etc/init.d/mysql restart
Sau khi máy chủ MySQL đã khởi động thành công, bạn sẽ muốn kiểm tra MySQL DBMS của mình và đảm bảo rằng tất cả cơ sở dữ liệu và bảng được khôi phục đúng cách. Chúng tôi cũng khuyên bạn nên kiểm tra nhật ký của mình để tìm các lỗi tiềm ẩn. Trong một số trường hợp, MySQL có thể khởi động thành công mặc dù có lỗi cơ sở dữ liệu.
Khôi phục một cơ sở dữ liệu duy nhất từ sao lưu
Trong trường hợp bạn chỉ tạo bản sao lưu cho một cơ sở dữ liệu hoặc chỉ cần khôi phục một cơ sở dữ liệu duy nhất, thì quá trình khôi phục có phần khác.
Trước khi bắt đầu quá trình khôi phục, phần này giả định hệ thống của bạn đang chạy phiên bản MySQL mới được cài đặt mà không có bất kỳ cơ sở dữ liệu hoặc bảng nào hiện có. Nếu bạn đã có cơ sở dữ liệu và bảng trong MySQL DBMS của mình, vui lòng sao lưu trước khi tiếp tục vì quá trình này sẽ ghi đè dữ liệu MySQL hiện tại.
-
Để khôi phục một cơ sở dữ liệu duy nhất bằng
mysql
lệnh, trước tiên hãy chuẩn bị cơ sở dữ liệu đích. Đăng nhập vào máy chủ cơ sở dữ liệu MySQL (mới) của bạn bằng ứng dụng khách MySQL:mysql -u root -p -h localhost
-
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi bạn đã cung cấp thông tin đăng nhập chính xác, bạn phải tạo cơ sở dữ liệu đích. Trong trường hợp này,
customer
cơ sở dữ liệu sẽ được khôi phục:1
CREATE DATABASE customer;
-
Như với tất cả các câu lệnh MySQL, không bỏ qua dấu chấm phẩy cuối cùng (ví dụ:
;
) ở cuối mỗi lệnh. Tùy thuộc vào việc triển khai của bạn, bạn có thể cần tạo một người dùng MySQL mới hoặc tạo lại một người dùng trước đó có quyền truy cập vào cơ sở dữ liệu mới được tạo. Lệnh tạo người dùng MySQL mới có dạng sau:1
CREATE USER '[username]'@'[host]' IDENTIFIED BY '[password]';
-
Trong ví dụ tiếp theo, chúng tôi sẽ tạo người dùng có tên
customeradmin
:1
CREATE USER 'customeradmin'@'localhost' IDENTIFIED BY 's3cr1t';
-
Bây giờ chúng ta sẽ cung cấp cho
customeradmin
đặc quyền truy cậpcustomer
cơ sở dữ liệu. Lệnh cấp đặc quyền cho cơ sở dữ liệu cho một người dùng cụ thể có dạng sau:1
GRANT [privilegeType] ON [databaseName].[tableName] TO '[username]'@'[host]'
-
Đối với mục đích của ví dụ sau, chúng tôi sẽ cung cấp
customeradmin
toàn quyền truy cập vàocustomer
cơ sở dữ liệu. Phát hành lệnh sau trong máy khách MySQL:1
GRANT ALL ON customer.* TO 'customeradmin'@'localhost';
-
Bạn có thể cần chỉ định các cấp quyền truy cập khác nhau tùy thuộc vào nhu cầu triển khai của bạn. Tham khảo tài liệu chính thức cho tuyên bố GRANT của MySQL. Khi cơ sở dữ liệu đích và người dùng MySQL đã được tạo, bạn có thể đóng ứng dụng khách MySQL bằng lệnh sau:
quit
-
Bây giờ bạn có thể sử dụng
mysql
lệnh khôi phục tệp SQL của bạn. Hình thức của lệnh này giống như sau:mysql -u [username] -p[password] -h [host] [databaseName] < [filename].sql
Trong ví dụ sau, chúng tôi sẽ khôi phục customer
cơ sở dữ liệu từ tệp sao lưu SQL có tên customerBackup.sql
(đặc biệt chú ý đến <
ký hiệu trong lệnh này):
mysql -u root -p -h localhost customer < customerBackup.sql
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi cung cấp thông tin đăng nhập chính xác, quá trình khôi phục sẽ bắt đầu. Thời lượng của hoạt động này phụ thuộc vào tải hệ thống của bạn và kích thước của cơ sở dữ liệu mà bạn đang khôi phục. Quá trình này có thể hoàn thành sau vài giây hoặc có thể mất nhiều giờ.
Khôi phục một bảng từ bản sao lưu
Tùy chọn 1:Khôi phục một bảng duy nhất bằng MySQL và các bản sao lưu do mysqldump tạo
-
Trước khi bắt đầu quá trình khôi phục, chúng tôi giả định rằng phiên bản MySQL của bạn đã có một cơ sở dữ liệu hiện có có thể nhận bảng bạn muốn khôi phục. Nếu phiên bản MySQL của bạn không có cơ sở dữ liệu bắt buộc, chúng tôi sẽ cần tạo nó trước khi tiếp tục. Đầu tiên, đăng nhập vào phiên bản MySQL của bạn bằng lệnh sau:
mysql -u root -p -h localhost
-
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi bạn đã cung cấp thông tin đăng nhập chính xác, bạn phải tạo cơ sở dữ liệu đích. Đối với mục đích của ví dụ này, chúng tôi sẽ tạo
customer
cơ sở dữ liệu.1
CREATE DATABASE customer;
Sau đó thoát khỏi
mysql
lời nhắc:quit
Nếu bạn đã có cơ sở dữ liệu cần thiết, bạn có thể bỏ qua bước trên một cách an toàn. Để tiếp tục khôi phục bảng, hãy ra lệnh ở dạng sau:
mysql -u [username] -p[password] -h [host] [databaseName] < [filename].sql
-
Đối với ví dụ sau, chúng tôi sẽ khôi phục
order
bảng vàocustomer
hiện tại cơ sở dữ liệu từ tệp sao lưu SQL có têncustomerOrderBackup.sql
. Hãy hết sức cẩn thận khi sử dụng<
toán tử trong lệnh sau:mysql -u root -p -h localhost customer < customerOrderBackup.sql
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi cung cấp thông tin đăng nhập chính xác, quá trình khôi phục sẽ bắt đầu. Thời lượng của thao tác này tùy thuộc vào tải hệ thống của bạn và kích thước của bảng mà bạn đang khôi phục. Quá trình này có thể hoàn thành sau vài giây hoặc có thể mất nhiều giờ.
Tùy chọn 2:Khôi phục một bảng bằng cách sử dụng Máy khách MySQL và Tuyên bố INFILE cho Bản sao lưu được tạo bằng OUTFILE
-
Trước khi bắt đầu quá trình khôi phục, chúng tôi giả định rằng phiên bản MySQL của bạn đã có một cơ sở dữ liệu hiện có có thể nhận bảng bạn muốn khôi phục. Nếu phiên bản MySQL của bạn không có cơ sở dữ liệu bắt buộc, chúng tôi sẽ cần tạo nó trước khi tiếp tục. Đầu tiên, đăng nhập vào phiên bản MySQL của bạn bằng lệnh sau:
mysql -u root -p -h localhost
-
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi bạn đã cung cấp thông tin đăng nhập chính xác, bạn phải tạo cơ sở dữ liệu đích. Đối với mục đích của ví dụ này, chúng tôi sẽ tạo
customer
cơ sở dữ liệu.1
CREATE DATABASE customer;
Sau đó thoát khỏi
mysql
lời nhắc:quit
-
Bản sao lưu dữ liệu được sử dụng trong trường hợp này được tạo bằng cách sử dụng
SELECT * INTO OUTFILE 'backupFile.sql' FROM tableName
yêu cầu. Loại sao lưu này chỉ giữ lại bản thân dữ liệu nên cấu trúc bảng phải được tạo lại. Để khôi phục một bảng từ bên trong máy khách MySQL, trước tiên bạn phải chuẩn bị cơ sở dữ liệu và bảng đích. Đăng nhập vào phiên bản MySQL (mới) của bạn bằng ứng dụng khách MySQL:mysql -u root -p -h localhost
-
Bạn sẽ được nhắc nhập mật khẩu của người dùng MySQL gốc. Sau khi cung cấp thông tin đăng nhập chính xác, bạn phải tạo cơ sở dữ liệu đích. Trong trường hợp này, chúng tôi sẽ tạo
customer
cơ sở dữ liệu. Đưa ra tuyên bố sau:1
CREATE DATABASE customer;
-
Hãy nhớ rằng dấu chấm phẩy (ví dụ:
;
) theo sau mỗi câu lệnh là bắt buộc. Bây giờ bạn phải tạo bảng đích với cấu trúc chính xác. Các kiểu dữ liệu của các trường trong bảng phải phản ánh kiểu dữ liệu của bảng nơi bắt nguồn sao lưu. Trong ví dụ này, chúng tôi sẽ khôi phụcorder
bảng củacustomer
cơ sở dữ liệu. Có 2 trường trongorder
bảng,custNum
với kiểu dữ liệuINT
vàorderName
với kiểu dữ liệuVARCHAR(20)
; cấu trúc bảng của bạn sẽ khác:1 2
USE customer; CREATE TABLE order (custNum INT, orderName VARCHAR(20));
-
Tùy thuộc vào việc triển khai của bạn, bạn có thể cần tạo một người dùng MySQL mới hoặc tạo lại một người dùng trước đó có quyền truy cập vào cơ sở dữ liệu mới được tạo. Lệnh tạo người dùng MySQL mới có dạng sau:
1
CREATE USER '[username]'@'[host]' IDENTIFIED BY '[password]';
-
Trong ví dụ tiếp theo, chúng tôi sẽ tạo người dùng có tên
customeradmin
:1
CREATE USER 'customeradmin'@'localhost' IDENTIFIED BY 's3cr1t';
-
Bây giờ chúng ta sẽ cung cấp cho
customeradmin
đặc quyền truy cậpcustomer
cơ sở dữ liệu. Lệnh cấp đặc quyền cho cơ sở dữ liệu cho một người dùng cụ thể có dạng sau:1
GRANT [privilegeType] ON [databaseName].[tableName] TO '[username]'@'[host]'
Đối với mục đích của ví dụ sau, chúng tôi sẽ cung cấp
customeradmin
toàn quyền truy cập vàocustomer
cơ sở dữ liệu. Phát hành lệnh sau trong máy khách MySQL:1
GRANT ALL ON customer.* TO 'customeradmin'@'localhost';
-
Bạn có thể cần chỉ định các cấp quyền truy cập khác nhau tùy thuộc vào nhu cầu triển khai của bạn. Tham khảo tài liệu chính thức cho tuyên bố GRANT của MySQL. Khi bảng và người dùng đã được tạo, chúng tôi có thể nhập dữ liệu sao lưu từ tệp sao lưu bằng cách sử dụng
LOAD DATA
yêu cầu. Cú pháp tương tự như sau:1
LOAD DATA INFILE '[filename]' INTO TABLE [tableName];
Trong ví dụ sau, chúng tôi sẽ khôi phục dữ liệu từ bảng từ tệp có tên
customerOrderBackup.sql
. Khi máy khách MySQL được cung cấp đường dẫn và tên tệp sauINFILE
, nó nằm trong thư mục dữ liệu MySQL cho tệp đó. Nếu tên tệpcustomerOrderBackup.sql
đã được cung cấp, đường dẫn sẽ là/var/lib/mysql/customerOrderBackup.sql
. Đảm bảo rằng tệp bạn đang cố gắng khôi phục tồn tại, đặc biệt nếu MySQL tạoFile not found
lỗi. -
Để nhập dữ liệu từ
customerOrderBackup.sql
tệp nằm trong/var/lib/mysql/
, đưa ra lệnh sau:1
LOAD DATA INFILE 'customerOrderBackup.sql' INTO TABLE order;
This process can take anywhere from a few seconds to many hours depending on the size of your table. The duration of this operation depends on your system’s load and the size of the table that you are restoring. It may complete in a few seconds, or it may take many hours. After you have verified that your data was imported successfully, you can log out:
quit
Thông tin khác
Bạn có thể muốn tham khảo các nguồn sau đây để biết thêm thông tin về chủ đề này. Mặc dù những điều này được cung cấp với hy vọng rằng chúng sẽ hữu ích, xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc kịp thời của các tài liệu được lưu trữ bên ngoài.
- The Official MySQL Web Site
- Trang Phương pháp sao lưu cơ sở dữ liệu MySQL
- mysqldump Manual Page
- Schedule Tasks With Cron
- MySQL’s Grant Statement, Official Documentation