Di chuyển từ cơ sở dữ liệu Oracle sang mã nguồn mở có thể mang lại một số lợi ích. Chi phí sở hữu thấp hơn đang hấp dẫn và thúc đẩy nhiều công ty di cư. Đồng thời DevOps, SysOps hoặc DBA cần phải duy trì SLA chặt chẽ để giải quyết nhu cầu kinh doanh.
Một trong những mối quan tâm chính khi bạn lập kế hoạch di chuyển dữ liệu sang một cơ sở dữ liệu khác, đặc biệt là nguồn mở là làm thế nào để tránh mất dữ liệu. Tìm nạp không quá xa khi ai đó vô tình xóa một phần của cơ sở dữ liệu, ai đó quên đưa mệnh đề WHERE vào truy vấn DELETE hoặc vô tình chạy DROP TABLE. Câu hỏi đặt ra là làm thế nào để phục hồi sau những tình huống như vậy.
Những sự việc như thế có thể và sẽ xảy ra, đó là điều không thể tránh khỏi nhưng tác động có thể rất tai hại. Như ai đó đã nói, "Tất cả đều thú vị và trò chơi cho đến khi sao lưu không thành công". Tài sản quý giá nhất không thể bị xâm phạm. Khoảng thời gian.
Nỗi sợ hãi về cái chưa biết là điều đương nhiên nếu bạn không quen với công nghệ mới. Trên thực tế, kiến thức về các giải pháp cơ sở dữ liệu Oracle, độ tin cậy và các tính năng tuyệt vời mà Oracle Recovery Manager (RMAN) cung cấp có thể không khuyến khích bạn hoặc nhóm của bạn di chuyển sang hệ thống cơ sở dữ liệu mới. Chúng tôi thích sử dụng những thứ chúng tôi biết, vậy tại sao phải di chuyển khi giải pháp hiện tại của chúng tôi hoạt động. Ai biết có bao nhiêu dự án bị đình trệ vì nhóm hoặc cá nhân không bị thuyết phục về công nghệ mới?
Sao lưu lôgic (exp / imp, expdp / impdb)
Theo tài liệu MySQL, sao lưu lôgic là “một bản sao lưu tái tạo cấu trúc bảng và dữ liệu, mà không sao chép các tệp dữ liệu thực tế”. Định nghĩa này có thể áp dụng cho cả thế giới MySQL và Oracle. Tương tự là “tại sao” và “khi nào” bạn sẽ sử dụng bản sao lưu hợp lý.
Sao lưu logic là một lựa chọn tốt khi chúng tôi biết dữ liệu nào sẽ được sửa đổi để bạn chỉ có thể sao lưu phần bạn cần. Nó đơn giản hóa việc khôi phục tiềm năng về thời gian và độ phức tạp. Nó cũng rất hữu ích nếu chúng ta cần di chuyển một số phần của tập dữ liệu có kích thước vừa / nhỏ và sao chép trở lại hệ thống khác (thường là trên một phiên bản cơ sở dữ liệu khác). Oracle sử dụng các tiện ích xuất khẩu như exp và expdp để đọc dữ liệu cơ sở dữ liệu và sau đó xuất nó thành một tệp ở cấp hệ điều hành. Sau đó, bạn có thể nhập dữ liệu trở lại cơ sở dữ liệu bằng cách sử dụng các tiện ích nhập imp hoặc impdp.
Oracle Export Utilities cung cấp cho chúng ta rất nhiều tùy chọn để chọn dữ liệu nào cần được xuất. Bạn chắc chắn sẽ không tìm thấy cùng một số tính năng với mysql, nhưng hầu hết các nhu cầu đều được đề cập và phần còn lại có thể được thực hiện bằng các công cụ bên ngoài hoặc tập lệnh bổ sung (kiểm tra mydumper).
MySQL đi kèm với một gói công cụ cung cấp chức năng rất cơ bản. Chúng là mysqldump, mysqlpump (phiên bản hiện đại của mysqldump có hỗ trợ gốc cho song song) và ứng dụng khách MySQL có thể được sử dụng để trích xuất dữ liệu vào một tệp phẳng.
Dưới đây, bạn có thể tìm thấy một số ví dụ về cách sử dụng chúng:
Chỉ sao lưu cấu trúc cơ sở dữ liệu
mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql
Cấu trúc bảng dự phòng
mysqldump --no-data --single- transaction -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql
Sao lưu các hàng cụ thể
mysqldump -h localhost --single- transaction -u root -ppassword mydatabase table_name --where="date_created='2019-05-07'" > table_with_specific_rows_dump.sql
Nhập Bảng
mysql -u username -p -D dbname < tableName.sql
Lệnh trên sẽ dừng tải nếu xảy ra lỗi.
Nếu bạn tải dữ liệu trực tiếp từ máy khách mysql, các lỗi sẽ được bỏ qua và máy khách sẽ tiếp tục
mysql> source tableName.sql
Để ghi đầu ra, bạn cần sử dụng
mysql> tee import_tableName.log
Bạn có thể tìm thấy tất cả các cờ được giải thích dưới các liên kết dưới đây:
- https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
- https://dev.mysql.com/doc/refman/8.0/en/mysqlimport.html
- https://dev.mysql.com/doc/refman/8.0/en/mysql.html
Nếu bạn định sử dụng sao lưu hợp lý trên các phiên bản cơ sở dữ liệu khác nhau, hãy đảm bảo rằng bạn có thiết lập đối chiếu phù hợp. Câu lệnh sau có thể được sử dụng để kiểm tra bộ ký tự mặc định và đối chiếu cho một cơ sở dữ liệu nhất định:
USE mydatabase;
SELECT @@character_set_database, @@collation_database;
Một cách khác để truy xuất biến hệ thống collation_database là sử dụng BIẾN HÌNH HIỂN THỊ.
SHOW VARIABLES LIKE 'collation%';
Vì những hạn chế của kết xuất mysql, chúng tôi thường phải sửa đổi kết quả đầu ra. Một ví dụ về sửa đổi như vậy có thể là cần phải loại bỏ một số dòng. May mắn thay, chúng tôi có thể linh hoạt trong việc xem và sửa đổi đầu ra bằng các công cụ văn bản tiêu chuẩn trước khi khôi phục. Các công cụ như awk, grep, sed có thể trở thành bạn của bạn. Dưới đây là một ví dụ đơn giản về cách xóa dòng thứ ba khỏi tệp kết xuất.
sed -i '1,3d' file.txt
Khả năng là vô tận. Đây là điều mà chúng tôi sẽ không tìm thấy với Oracle vì dữ liệu được viết ở định dạng nhị phân.
Có một số điều bạn cần xem xét khi thực thi mysql logic. Một trong những hạn chế chính là hỗ trợ thuần túy tính song song và khóa đối tượng.
Cân nhắc sao lưu hợp lý
Khi sao lưu như vậy được thực hiện, các bước sau sẽ được thực hiện.
- Bảng LOCK TABLE.
- HIỂN THỊ bảng CREATE TABLE.
- CHỌN * TỪ bảng VÀO tệp tạm thời OUTFILE.
- Ghi nội dung của tệp tạm thời vào cuối tệp kết xuất.
- MỞ KHÓA BẢNG BIỂU
Theo mặc định, mysqldump không bao gồm các quy trình và sự kiện trong đầu ra của nó - bạn phải đặt cờ --routines và --events một cách rõ ràng.
Một cân nhắc quan trọng khác là một công cụ mà bạn sử dụng để lưu trữ dữ liệu của mình. Hy vọng rằng ngày nay hầu hết các hệ thống sản xuất sử dụng công cụ tuân thủ ACID được gọi là InnoDB. Công cụ cũ hơn MyISAM đã phải khóa tất cả các bảng để đảm bảo tính nhất quán. Đây là lúc FLUSH TABLES WITH READ LOCK được thực thi. Thật không may, đó là cách duy nhất để đảm bảo ảnh chụp nhanh nhất quán của các bảng MyISAM trong khi máy chủ MySQL đang chạy. Điều này sẽ làm cho máy chủ MySQL trở thành chỉ đọc cho đến khi BẢNG MỞ KHÓA được thực thi.
Đối với các bảng trên công cụ lưu trữ InnoDB, bạn nên sử dụng tùy chọn --single- transaction. Sau đó, MySQL tạo ra một điểm kiểm tra cho phép kết xuất thu thập tất cả dữ liệu trước điểm kiểm tra trong khi nhận các thay đổi đến.
Tùy chọn --single-transaction của mysqldump không làm BẢNG LỖI BẰNG KHÓA ĐỌC. Nó khiến mysqldump thiết lập một giao dịch REPEATABLE READ cho tất cả các bảng được kết xuất.
Bản sao lưu mysqldump chậm hơn nhiều so với các công cụ Oracle exp, expdp. Mysqldump là một công cụ đơn luồng và đây là nhược điểm đáng kể nhất của nó - hiệu suất tốt đối với cơ sở dữ liệu nhỏ nhưng nó nhanh chóng trở nên không thể chấp nhận được nếu tập dữ liệu tăng lên hàng chục gigabyte.
- BẮT ĐẦU GIAO DỊCH VỚI SNAPSHOT ĐỒNG Ý.
- Đối với mỗi lược đồ và bảng cơ sở dữ liệu, một kết xuất thực hiện các bước sau:
- HIỂN THỊ bảng CREATE TABLE.
- CHỌN * TỪ bảng VÀO tệp tạm thời OUTFILE.
- Ghi nội dung của tệp tạm thời vào cuối tệp kết xuất.
- CAM KẾT.
Bản sao lưu vật lý (RMAN)
May mắn thay, hầu hết các hạn chế của sao lưu hợp lý có thể được giải quyết bằng công cụ Percona Xtrabackup. Percona XtraBackup là phần mềm sao lưu nóng MySQL / MariaDB mã nguồn mở, phổ biến nhất, thực hiện sao lưu không chặn cho cơ sở dữ liệu InnoDB và XtraDB. Nó thuộc danh mục sao lưu vật lý, bao gồm các bản sao chính xác của thư mục dữ liệu MySQL và các tệp bên dưới nó.
Đó là cùng một danh mục các công cụ như Oracle RMAN. RMAN là một phần của phần mềm cơ sở dữ liệu, XtraBackup cần được tải xuống riêng. Xtrabackup có sẵn dưới dạng gói rpm và deb và chỉ hỗ trợ các nền tảng Linux. Việc cài đặt rất đơn giản:
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm
$ yum localinstall percona-XtraBackup-80-8.0.4-1.el7.x86_64.rpm
XtraBackup không khóa cơ sở dữ liệu của bạn trong quá trình sao lưu. Đối với cơ sở dữ liệu lớn (hơn 100 GB), nó cung cấp thời gian khôi phục tốt hơn nhiều so với mysqldump. Quá trình khôi phục bao gồm việc chuẩn bị dữ liệu MySQL từ các tệp sao lưu, trước khi thay thế hoặc chuyển nó bằng thư mục dữ liệu hiện tại trên nút đích.
Percona XtraBackup hoạt động bằng cách ghi nhớ số thứ tự nhật ký (LSN) khi nó khởi động và sau đó sao chép các tệp dữ liệu sang một vị trí khác. Việc sao chép dữ liệu mất một khoảng thời gian và nếu các tệp đang thay đổi, chúng sẽ phản ánh trạng thái của cơ sở dữ liệu tại các thời điểm khác nhau. Đồng thời, XtraBackup chạy một quy trình nền theo dõi các tệp nhật ký giao dịch (hay còn gọi là nhật ký làm lại) và sao chép các thay đổi từ đó. Việc này phải được thực hiện liên tục vì nhật ký giao dịch được viết theo kiểu tuần hoàn và có thể được sử dụng lại sau một thời gian. XtraBackup cần bản ghi nhật ký giao dịch cho mọi thay đổi đối với tệp dữ liệu kể từ khi nó bắt đầu thực thi.
Khi XtraBackup được cài đặt, bạn cuối cùng cũng có thể thực hiện các bản sao lưu vật lý đầu tiên của mình.
xtrabackup --user=root --password=PASSWORD --backup --target-dir=/u01/backups/
Một tùy chọn hữu ích khác mà quản trị viên MySQL thực hiện là phát trực tuyến sao lưu tới một máy chủ khác. Luồng như vậy có thể được thực hiện bằng cách sử dụng công cụ xbstream, như trong ví dụ dưới đây:
Khởi động trình nghe trên máy chủ bên ngoài trên cổng thích hợp (trong ví dụ này là 1984)
nc -l 1984 | pigz -cd - | pv | xbstream -x -C /u01/backups
Chạy sao lưu và chuyển sang máy chủ bên ngoài
innobackupex --user=root --password=PASSWORD --stream=xbstream /var/tmp | pigz | pv | nc external_host.com 1984
Như bạn có thể nhận thấy, quá trình khôi phục được chia thành hai bước chính (tương tự như Oracle). Các bước được khôi phục (sao chép lại) và khôi phục (áp dụng nhật ký).
XtraBackup --copy-back --target-dir=/var/lib/data
innobackupex --apply-log --use-memory=[values in MB or GB] /var/lib/data
Sự khác biệt là chúng tôi chỉ có thể thực hiện khôi phục đến thời điểm sao lưu đã được thực hiện. Để áp dụng các thay đổi sau khi sao lưu, chúng tôi cần thực hiện theo cách thủ công.
Khôi phục điểm trong thời gian (khôi phục RMAN)
Trong Oracle, RMAN thực hiện tất cả các bước khi chúng tôi thực hiện khôi phục cơ sở dữ liệu. Nó có thể được thực hiện theo SCN hoặc thời gian hoặc dựa trên tập dữ liệu sao lưu.
RMAN> run
{
allocate channel dev1 type disk;
set until time "to_date('2019-05-07:00:00:00', 'yyyy-mm-dd:hh24:mi:ss')";
restore database;
recover database; }
Trong mysql, chúng ta cần một công cụ khác để thực hiện trích xuất dữ liệu từ các bản ghi nhị phân (tương tự như Oracle’s archivelogs) mysqlbinlog. mysqlbinlog có thể đọc nhật ký nhị phân và chuyển đổi chúng thành tệp. Những gì chúng ta cần làm là
Thủ tục cơ bản sẽ là
- Khôi phục bản sao lưu đầy đủ
- Khôi phục các bản sao lưu gia tăng
- Để xác định thời gian bắt đầu và kết thúc khôi phục (đó có thể là thời điểm kết thúc sao lưu và số vị trí trước khi không may bị rớt bảng).
- Chuyển đổi binglog cần thiết sang SQL và áp dụng các tệp SQL mới được tạo theo trình tự thích hợp - đảm bảo chạy một lệnh mysqlbinlog.
> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
Mã hóa các bản sao lưu (Ví Oracle)
Percona XtraBackup có thể được sử dụng để mã hóa hoặc giải mã các bản sao lưu cục bộ hoặc phát trực tuyến với tùy chọn xbstream để thêm một lớp bảo vệ khác cho các bản sao lưu. Cả tùy chọn --encrypt-key và --encryptkey-file đều có thể được sử dụng để chỉ định khóa mã hóa. Khóa mã hóa có thể được tạo bằng các lệnh như
$ openssl rand -base64 24
$ bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1
Giá trị này sau đó có thể được sử dụng làm khóa mã hóa. Ví dụ về lệnh innobackupex sử dụng --encrypt-key:
$ innobackupex --encrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1” /storage/backups/encrypted
Để giải mã, chỉ cần sử dụng tùy chọn --decrypt với --encrypt-key:
$ innobackupex --decrypt=AES256 --encrypt-key=”bWuYY6FxIPp3Vg5EDWAxoXlmEFqxUqz1”
/storage/backups/encrypted/2019-05-08_11-10-09/
Chính sách sao lưu
Không có bản dựng nào trong chức năng chính sách sao lưu trong MySQL / MariaDB hoặc thậm chí là công cụ của Percona. Nếu bạn muốn quản lý các bản sao lưu logic hoặc vật lý MySQL của mình, bạn có thể sử dụng ClusterControl cho việc đó.
ClusterControl là hệ thống quản lý cơ sở dữ liệu mã nguồn mở toàn diện dành cho người dùng có môi trường hỗn hợp. Nó cung cấp chức năng quản lý sao lưu nâng cao cho MySQL hoặc MariaDB.
Với ClusterControl, bạn có thể:
- Tạo các chính sách dự phòng
- Giám sát trạng thái sao lưu, quá trình thực thi và máy chủ không có bản sao lưu
- Thực hiện sao lưu và khôi phục (bao gồm cả khôi phục kịp thời)
- Kiểm soát việc lưu giữ bản sao lưu
- Lưu các bản sao lưu trong bộ nhớ đám mây
- Xác thực các bản sao lưu (kiểm tra toàn bộ với quá trình khôi phục trên máy chủ độc lập)
- Mã hóa các bản sao lưu
- Nén các bản sao lưu
- Và nhiều người khác
Giữ các bản sao lưu trên đám mây
Các tổ chức đã từng triển khai các giải pháp sao lưu băng từ trước đây như một phương tiện để bảo vệ dữ liệu
khỏi các lỗi. Tuy nhiên, sự xuất hiện của điện toán đám mây công cộng cũng cho phép các mô hình mới có TCO thấp hơn so với những gì đã có trước đây. Không có ý nghĩa kinh doanh gì khi trừu tượng hóa chi phí của một giải pháp DR khỏi thiết kế của nó, vì vậy các tổ chức phải thực hiện mức độ bảo vệ phù hợp với chi phí thấp nhất có thể.
Đám mây đã thay đổi ngành công nghiệp sao lưu dữ liệu. Do mức giá phải chăng của nó, các doanh nghiệp nhỏ hơn có giải pháp ngoại vi sao lưu tất cả dữ liệu của họ (và vâng, hãy đảm bảo rằng nó được mã hóa). Cả Oracle và MySQL đều không cung cấp các giải pháp lưu trữ đám mây tích hợp sẵn. Thay vào đó, bạn có thể sử dụng các công cụ do nhà cung cấp Cloud cung cấp. Một ví dụ ở đây có thể là s3.
aws s3 cp severalnines.sql s3://severalnine-sbucket/mysql_backups
Kết luận
Có một số cách để sao lưu cơ sở dữ liệu của bạn, nhưng điều quan trọng là phải xem xét nhu cầu kinh doanh trước khi quyết định chiến lược sao lưu. Như bạn có thể thấy, có nhiều điểm tương đồng giữa các bản sao lưu MySQL và Oracle, hy vọng có thể đáp ứng cho bạn SLA của bạn.
Luôn đảm bảo rằng bạn thực hành các lệnh này. Không chỉ khi bạn mới làm quen với công nghệ mà bất cứ khi nào DBMS trở nên không sử dụng được, bạn biết phải làm gì.
Nếu bạn muốn tìm hiểu thêm về MySQL, vui lòng xem whitepaper của chúng tôi Hướng dẫn DevOps về Sao lưu cơ sở dữ liệu cho MySQL và MariaDB.