Hướng dẫn nhanh về Sao lưu-Phục hồi Gbak
1.1 Sao lưu Firebird đơn giản nhất với lệnh gbak
1.2. Sao lưu cục bộ với gbak có thể thực hiện trực tuyến trên Windows
1.3. Sao lưu với gbak sử dụng chuỗi kết nối TCP/IP
1.4. Sao lưu nhanh hơn với gbak sử dụng Service Manager
1.5. Sao lưu nhanh nhất với gbak sử dụng Service Manager và tắt thu gom rác
1.6. Sao lưu đến chia sẻ mạng hoặc vị trí mạng
1.7. Sao lưu đơn giản từ máy chủ từ xa đến máy cục bộ
1.8. Sao lưu nhanh hơn từ máy chủ từ xa đến máy cục bộ với Service Manager
2.1. Lệnh khôi phục đơn giản nhất
2.2. Khôi phục với chuỗi kết nối localhost
2.3. Khôi phục với XNET trên Windows
2.4. Khôi phục nhanh hơn với Service Manager
2.5. Tùy chọn không được khuyến nghị
2.6. Khôi phục cơ sở dữ liệu bằng alias
2.7. Khôi phục bản sao lưu cục bộ đến máy chủ từ xa
2.8. Khôi phục bản sao lưu cục bộ đến máy chủ từ xa với Service Manager
2.9. Khôi phục các bảng cực dài
3. Tinh chỉnh và ghi nhật ký quá trình sao lưu và khôi phục
3.2. Thêm thống kê hiệu suất vào đầu ra chi tiết
3.3. Loại trừ các bảng khỏi sao lưu và/hoặc khôi phục
3.4. Lấy mật khẩu cho sao lưu hoặc khôi phục từ tệp
Câu hỏi rất thường gặp về VM và Sao lưu Firebird
Phụ lục A. Lỗi trong quá trình sao lưu/khôi phục
gbak là gì?
Gbak là một công cụ dòng lệnh tiêu chuẩn của Firebird (xem tài liệu chính thức tại đây), được thiết kế để thực hiện 1) sao lưu toàn bộ cơ sở dữ liệu: nó đọc mọi bản ghi trong cơ sở dữ liệu và lưu chúng vào tệp sao lưu, 2) khôi phục bản sao lưu vào cơ sở dữ liệu mới.
Đối với các nhà phát triển và quản trị viên có kinh nghiệm với các RDBMS khác, thuật ngữ “sao lưu” có thể hơi gây nhầm lẫn, vì gbak tạo ra không phải bản sao chính xác của cơ sở dữ liệu, mà là tệp ở định dạng không phải cơ sở dữ liệu, chỉ chứa dữ liệu (các chỉ mục được lưu dưới dạng khai báo).
Để tạo cơ sở dữ liệu từ tệp sao lưu gbak, cần thực hiện quá trình khôi phục với gbak.
1. Làm chủ sao lưu với Gbak
1.0. Chuẩn bị
Hãy tạo thư mục C:\data và đặt một cơ sở dữ liệu nào đó vào đó. Chúng ta sẽ sử dụng cơ sở dữ liệu 5Gb từ Firebird OLTP-EMUL test, nhưng tất nhiên bạn có thể sử dụng cơ sở dữ liệu của riêng mình.
Đối với người dùng Linux - hãy tạo thư mục /db và thay đổi chủ sở hữu thành “firebird”, rồi sao chép cơ sở dữ liệu vào đó (đảm bảo chủ sở hữu của nó cũng là firebird).
mkdir /db
chown firebird -R /db
1.1 Sao lưu Firebird đơn giản nhất với lệnh gbak
Windows
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey
Trong ví dụ này, công cụ gbak truy cập tệp cơ sở dữ liệu bằng truy cập cục bộ hoặc nhúng.
Firebird 3.0: Truy cập nhúng trong cấu hình mặc định cho Firebird 3.0 (với tham số trong firebird.conf ServerMode = SuperServer) sẽ cố gắng đặt khóa độc quyền trên cơ sở dữ liệu, vì vậy các kết nối khác sẽ không thể truy cập cơ sở dữ liệu (hoặc nỗ lực gbak sẽ thất bại do các kết nối đang hoạt động).
Firebird 2.5: Với Firebird 2.5 trên Windows, lệnh sẽ hoạt động tốt thông qua giao thức XNET (nếu bạn chỉ chạy một phiên bản Firebird duy nhất, tất nhiên). Trên Linux, Firebird sẽ cố gắng sử dụng truy cập nhúng, nếu không truy cập được, nó sẽ tự động (và ngầm định) cố gắng kết nối qua TCP/IP. (Nếu bạn không biết ý nghĩa của XNET, INET, v.v., vui lòng xem Firebird Connection Strings Cheat Sheet).
Lưu ý 1: Lệnh này chạy dưới tài khoản người dùng OS (tức là tài khoản của bạn) và sử dụng quyền của tài khoản đó để truy cập tệp sao lưu và cơ sở dữ liệu.
Thông thường, dịch vụ Firebird trên Windows chạy với tài khoản LocalSystem, và trên Linux chạy dưới người dùng “firebird”, nhưng bảng điều khiển thường được chạy dưới tài khoản người dùng của riêng bạn.
Nếu tài khoản người dùng này không có quyền truy cập vào đường dẫn cơ sở dữ liệu hoặc đường dẫn sao lưu, gbak sẽ thất bại với lỗi “Cannot open backup file” (xem ví dụ trong Phụ lục A. Lỗi, #5).
Lưu ý 2: gbak -b âm thầm ghi đè tệp sao lưu. Vì vậy, nếu bạn đã có backup1.fbk, nó sẽ bị ghi đè.
Lưu ý 3: Trên Linux, lệnh gbak này sẽ tạo tệp sao lưu với chủ sở hữu bằng với người dùng bảng điều khiển.
Thời gian sao lưu cho lệnh này: 120 giây
1.2. Sao lưu cục bộ với gbak có thể thực hiện trực tuyến trên Windows
Phần này chỉ dành cho người dùng Windows! Thông thường, chúng ta cần thực hiện sao lưu trong khi có các kết nối đang hoạt động đến cơ sở dữ liệu, vì vậy thay vì kết nối nhúng, tốt hơn nên chỉ định rõ ràng giao thức cục bộ để tránh đặt khóa độc quyền trên tệp cơ sở dữ liệu bởi chính gbak trong Firebird 3, tức là XNET.
Đối với Firebird 3.0:
gbak -b xnet://c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey
Đối với Firebird 2.5, chúng ta có thể sử dụng chuỗi kết nối cục bộ và nó cũng sẽ sử dụng XNET:
gbak -b c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey
Trên Linux, Firebird không hỗ trợ giao thức cục bộ cụ thể như XNET trên Windows, vì vậy cần sử dụng chuỗi kết nối TCP/IP (xem phần 1.3).
Ngoài ra, XNET chỉ hoạt động cho một phiên bản Firebird duy nhất, vì vậy nếu bạn chạy nhiều phiên bản Firebird trên Windows, có thể dễ dàng hơn khi sử dụng chuỗi kết nối kiểu INET để chỉ định phiên bản máy chủ đích.
Thời gian sao lưu: 139 giây
1.3. Sao lưu với gbak sử dụng chuỗi kết nối TCP/IP
Đây là lệnh gbak phổ biến nhất để thực hiện sao lưu trực tuyến.
Windows
gbak -b localhost:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b localhost:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey
Trong trường hợp này, bằng cách chỉ định localhost: ở đầu đường dẫn cơ sở dữ liệu, kết nối được thực hiện thông qua hệ thống mạng của Firebird.
Nó chậm hơn một chút so với truy cập cục bộ nhưng hoạt động trong mọi trường hợp khi chúng ta có một máy chủ đang chạy chấp nhận kết nối.
Cổng không chuẩn cho Firebird
Nếu bạn có Firebird chạy trên cổng không chuẩn (ví dụ: 3051 thay vì 3050), bạn có thể sao lưu theo cách này:
Windows
gbak -b localhost/3051:c:\Data\test1.fdb C:\data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b localhost/3051:/db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey
Thời gian sao lưu: 182 giây
1.4. Sao lưu nhanh hơn với gbak sử dụng Service Manager
Làm thế nào để đạt được tính phổ quát của kết nối TCP/IP, hỗ trợ cổng không chuẩn và sao lưu cục bộ nhanh? Hãy sử dụng Service Manager! Service Manager, nói một cách đơn giản, là cách chạy các công cụ tiêu chuẩn thông qua engine Firebird. Xin lưu ý rằng trong trường hợp Service Manager, không cần chỉ định tên máy chủ trong đường dẫn đến cơ sở dữ liệu, chỉ cần trong tham số -se.
Windows
gbak -b -se localhost:service_mgr c:\Data\test1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b -se localhost:service_mgr /db/test1.fdb /db/backup1.fbk -user SYSDBA -pass masterkey
Lệnh này sử dụng tùy chọn -service để chỉ định rằng chúng ta muốn sử dụng Service Manager của phiên bản Firebird trên cổng 3050 để thực hiện sao lưu.
Trong trường hợp này, sao lưu sẽ được thực hiện trực tiếp bên trong tiến trình Firebird (nó có một bản sao mã gbak), và vì giao tiếp trong tiến trình nhanh hơn nhiều, sao lưu sẽ nhanh hơn đáng kể trong trường hợp này.
Nếu Firebird chạy trên cổng không chuẩn (ví dụ: 3051), lệnh có thể trông như sau:
gbak -b -se localhost/3051:service_mgr c:\Data\test1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkey
Lưu ý: Có một hạn chế đáng kể trong Firebird 2.5 và Firebird 3.0.0-3.0.5 (chỉ được loại bỏ trong 3.0.6): dòng lệnh (tất cả các tham số và đường dẫn cho cơ sở dữ liệu và sao lưu) phải ít hơn 256 ký tự.
Nếu bạn gặp giới hạn này, ví dụ, do đường dẫn dài của cơ sở dữ liệu và sao lưu, bạn có thể khai báo một alias cho cơ sở dữ liệu trong databases.conf (3.0 trở lên) hoặc aliases.conf (2.5):
mydb1=c:\Data\test1.fdb #Windows
hoặc
mydb1=/db/test1.fdb #linux
và sau đó sử dụng nó trong lệnh của chúng ta:
Windows
gbak -b -se localhost:service_mgr mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b -se localhost:service_mgr mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey
Thời gian sao lưu: 115 giây
1.5. Sao lưu nhanh nhất với gbak và tắt thu gom rác
Để sao lưu nhanh hơn nữa, hãy thêm tùy chọn -g
-G(ARBAGE_COLLECT) ức chế thu gom rác
Vì vậy, lệnh sao lưu sẽ như sau
Windows
gbak -b -se localhost:service_mgr -g mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey
Linux
gbak -b -se localhost:service_mgr -g mydb1 /db/backup1.fbk -user SYSDBA -pass masterkey
Tùy chọn -g buộc engine Firebird vô hiệu hóa thu gom rác cho quá trình sao lưu trong tệp cơ sở dữ liệu.
Điều này không có nghĩa là các phiên bản bản ghi rác sẽ được lưu trong tệp sao lưu, mà có nghĩa là máy chủ sẽ không cố gắng dọn dẹp rác hiện có trong cơ sở dữ liệu trong quá trình sao lưu, và sao lưu sẽ nhanh hơn.
Chúng tôi khuyên bạn nên sử dụng tùy chọn này, vì chúng tôi tin rằng việc thu gom rác và dọn dẹp liên quan nên được thực hiện bằng sweep (gfix -sweep hoặc autosweep), vì vậy tốt hơn là không coi gbak như bất kỳ loại thay thế nào cho sweep.
Thời gian sao lưu: 105 giây
1.6. Sao lưu đến chia sẻ mạng hoặc vị trí mạng
Điều gì xảy ra nếu chúng ta cần đặt tệp sao lưu vào chia sẻ mạng?
Trên Windows
Sự nhầm lẫn thường gặp của người dùng Firebird mới: sao lưu thủ công (khi bạn bắt đầu lệnh từ dấu nhắc lệnh), với gbak -b đơn giản, đến chia sẻ mạng hoạt động tốt, nhưng phiên bản nhanh của gbak với -se localhost:service_mgr thì không hoạt động.
Lý do là Firebird trên Windows chạy dưới tài khoản LocalSystem, tài khoản này không có quyền truy cập vào các vị trí mạng (trừ khi các chia sẻ mạng này đã cấu hình quyền truy cập cho nhóm “Everyone”, nhưng điều này rất rất nguy hiểm trong thời đại ransomware của chúng ta).
Giải pháp là chạy dịch vụ Firebird trên Windows dưới tài khoản có đủ quyền để truy cập chia sẻ mạng, đồng thời có đủ quyền để truy cập các tệp cơ sở dữ liệu cục bộ và các tệp hệ thống trong C:\ProgramData\Firebird. Ngoài ra, một ý tưởng tốt là cấu hình tham số RestrictAccess trong firebird.conf.
Trên Linux
Vì Firebird trên Linux chạy dưới tài khoản “firebird”, hãy gắn kết chia sẻ mạng với ánh xạ đến người dùng “firebird”, để dịch vụ Firebird có thể truy cập vị trí mạng theo cách tương tự như ổ đĩa cục bộ.
1.7. Sao lưu đơn giản từ máy chủ từ xa đến máy cục bộ
Có thể sao lưu cơ sở dữ liệu từ máy chủ từ xa đến máy cục bộ.
Lệnh ví dụ bên dưới bắt đầu trên máy tính Windows, truy cập cơ sở dữ liệu trên máy chủ Linux (với địa chỉ IP 192.168.0.108, nhưng tất nhiên cũng có thể sử dụng tên máy chủ của máy chủ), và tệp sao lưu được lưu vào thư mục C:\Data trên Windows):
gbak -b -user SYSDBA -pass masterkey 192.168.0.108:/db/test1.fdb c:\data\remotebackup1.fbk
Thời gian sao lưu: 568 giây
Lệnh này thường sẽ chậm hơn nhiều so với sao lưu cục bộ, vì gbak đọc dữ liệu từ máy chủ từ xa và truyền các bản ghi qua mạng.
1.8. Sao lưu nhanh hơn từ máy chủ từ xa đến máy cục bộ với Service Manager
Lệnh bên dưới nhanh hơn so với sao lưu truyền thống từ máy chủ từ xa đến máy cục bộ, được mô tả trong #1.7
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb stdout > C:\Data\remoteback1.fbk
Lệnh này sử dụng Service Manager để thực hiện sao lưu trên máy chủ từ xa, nhưng đầu ra được gửi đến đường ống stdout, sau đó được chuyển hướng đến tệp cục bộ.
Lệnh này thường nhanh hơn 15%-20% so với #1.7 (Sao lưu đơn giản từ máy chủ từ xa đến máy cục bộ), do những lý do sau:
- nó thực hiện sao lưu thông qua Service Manager trên máy chủ từ xa, vì vậy tất cả các thao tác đọc và nén được thực hiện theo cách nhanh nhất,
- nó chỉ truyền qua mạng tệp sao lưu kết quả, với kích thước nhỏ hơn dữ liệu trong cơ sở dữ liệu
Tuy nhiên, với lệnh này, không thể bật chế độ chi tiết và lưu trữ đầu ra chi tiết vào tệp nhật ký.
Thời gian sao lưu: 473 giây
1.9. Sao lưu cơ sở dữ liệu Firebird trên máy chủ từ xa đến cùng máy chủ từ xa đó bằng Service Manager
Với Service Manager, có thể gọi sao lưu gbak của cơ sở dữ liệu trên máy chủ từ xa và lưu trữ nó trên cùng máy chủ từ xa đó.
gbak -b -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey /db/test1.fdb /db/back12.fbk
Lệnh này thông qua Service Manager gọi sao lưu trên máy chủ từ xa, với chỉ dẫn lưu trữ tệp sao lưu trên cùng máy chủ mạng đó.
Tất nhiên, vị trí sao lưu phải có thể truy cập được bởi dịch vụ Firebird (trên Linux nó chạy dưới người dùng “firebird”, trên Windows dưới tài khoản LocalSystem).
1.10. Sao lưu cơ sở dữ liệu Firebird nhanh hơn 6 lần với sao lưu đa luồng trong Firebird 5 (hoặc HQbird 2.5/3.0/4.0/5.0)
Nếu bạn vẫn chưa hài lòng với hiệu suất sao lưu của Firebird gbak, hãy cân nhắc nâng cấp lên Firebird 5 (hoặc sử dụng bản phân phối Firebird doanh nghiệp: HQbird cho các phiên bản khác).
Nó hỗ trợ sao lưu đa luồng, cho phép các thao tác sao lưu với gbak nhanh hơn tới 6 lần.
gbak -b -par 8 -se localhost:service_mgr -g C:\Data\testbigdb1.fdb c:\Data\backup1.fbk -user SYSDBA -pass masterkey
Như bạn có thể thấy, có một tham số mới -par 8, làm cho gbak sử dụng 8 luồng để tạo bản sao lưu.
HQbird thực hiện các tác vụ bảo trì (sweep, sao lưu, phục hồi) nhanh hơn nhiều (tất nhiên, kết quả trong hình dưới đây là từ một cơ sở dữ liệu khác):

2. Phục hồi bằng công cụ Gbak
Chúng ta có tệp sao lưu backup1.fbk, được tạo bởi một trong các lệnh trên, và chúng ta cần phục hồi nó một cách nhanh chóng và hiệu quả.
Giả sử tệp nằm trong C:\Data\backup1.fbk trong trường hợp Windows, hoặc /db/backup1.fbk trong trường hợp Linux.
2.1. Lệnh phục hồi đơn giản nhất
Trên Windows
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey
Trên Linux
gbak -c /db/backup1.fbk /db/new1.fdb -user SYSDBA -pass masterkey
Trước hết, xin lưu ý rằng gbak -c không ghi đè tệp cơ sở dữ liệu, và nếu tồn tại tệp C:\data\new1.fdb hoặc /db/new1.fdb, gbak sẽ trả về lỗi nói rằng cơ sở dữ liệu đã tồn tại.
Sau đó, lệnh này thực sự hoạt động rất khác nhau trên 2.5/3.0+ và Windows/Linux.
Trên Linux, lệnh này sẽ sử dụng truy cập nhúng vào cơ sở dữ liệu được tạo (tất nhiên, nếu bạn không thay đổi thứ tự các nhà cung cấp Firebird trong firebird.conf) cho cả 3.0 và 2.5.
Trên Windows, trên Firebird 3.0 với thứ tự mặc định của các nhà cung cấp, nó sẽ là truy cập nhúng, trên 2.5 - XNET.
Sau đó, lệnh này tạo một tệp với quyền của người dùng đã khởi động gbak, điều này đặc biệt quan trọng trên Linux - nếu bạn chạy gbak như vậy dưới quyền root, chủ sở hữu của tệp cơ sở dữ liệu sẽ là root, và tiến trình Firebird, chạy dưới người dùng “firebird”, sẽ không thể truy cập tệp đã được phục hồi.
Lưu ý cho người dùng Linux
Nhiều người, để “sửa” quyền sở hữu, áp dụng quyền cho mọi người truy cập cơ sở dữ liệu đã phục hồi, tức là, một cái gì đó như “chmod 777 database”, nhưng điều này rất không an toàn, cách đúng đắn là thay đổi chủ sở hữu của cơ sở dữ liệu thành firebird, với lệnh sau
chown firebird /db/new1.fdb
Nói chung, lệnh này đủ tốt cho việc phục hồi đơn giản các cơ sở dữ liệu không phải sản xuất (được sử dụng để kiểm thử hoặc phát triển).
Thời gian phục hồi: 275 giây
2.2. Phục hồi với chuỗi kết nối localhost
Tùy chọn phục hồi phổ biến nhất, nhưng không phải nhanh nhất là:
Windows
gbak -c C:\Data\backup1.fbk localhost:C:\data\new1.fdb -user SYSDBA -pass masterkey
Linux
gbak -c /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey
Cổng không chuẩn
Nếu Firebird đang chạy trên cổng không chuẩn, ví dụ, 3051, nó có thể được chỉ định trong lệnh phục hồi:
Windows
gbak -c C:\Data\backup1.fbk localhost/3051:C:\data\new1.fdb -user SYSDBA -pass masterkey
Linux
gbak -c /db/backup1.fbk localhost/3051:/db/new1.fdb -user SYSDBA -pass masterkey
Thời gian phục hồi: 1225 giây
2.3. Phục hồi với XNET trên Windows
Để phục hồi nhanh hơn một chút, trên Windows chúng ta có thể sử dụng XNET (cho Firebird 3.0 trở lên):
gbak -c C:\Data\backup1.fbk xnet://C:\Data\New2.fdb -user SYSDBA -pass masterkey
Trên Firebird 2.5 trên Windows, truy cập XNET sẽ được sử dụng với dòng lệnh đơn giản (nếu chỉ có một phiên bản Firebird đang chạy):
gbak -c C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey
Thời gian phục hồi: 585 giây
2.4. Phục hồi nhanh hơn với Service Manager
Và cách nhanh nhất để phục hồi là sử dụng Service Manager
Windows
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new1.fdb -user SYSDBA -pass masterkey
Linux
gbak -c -se localhost:service_mgr /db/backup1.fbk localhost:/db/new1.fdb -user SYSDBA -pass masterkey
Với tùy chọn -se, chúng ta gọi Service Manager trên địa chỉ localhost và chỉ dẫn nó thực hiện mã phục hồi bên trong công cụ Firebird.
Khi phục hồi được thực hiện bởi Service Manager, tệp cơ sở dữ liệu được tạo sẽ thuộc sở hữu của tài khoản chạy phiên bản Firebird (tiến trình) - đó là “firebird” trên Linux, và LocalSystem trên Windows.
Thời gian phục hồi: 244 giây
2.5. Tùy chọn không được khuyến nghị
Tại một thời điểm nào đó, bạn có thể có sự cám dỗ để sử dụng tùy chọn sau:
-R(ECREATE_DATABASE) [O(VERWRITE)] create (or replace if OVERWRITE used) database from backup file (restore)
để buộc thay thế cơ sở dữ liệu hiện có bằng cơ sở dữ liệu mới.
Theo kinh nghiệm của chúng tôi, tùy chọn này làm tăng đáng kể khả năng vô tình ghi đè cơ sở dữ liệu sản xuất.
Chúng tôi khuyến nghị mạnh mẽ rằng mỗi lần phục hồi cơ sở dữ liệu với tên mới và đổi tên nó, cũng như xóa cơ sở dữ liệu cũ một cách rõ ràng.
Chúng tôi thậm chí sẽ không cung cấp ví dụ về lệnh với tùy chọn này.
2.6. Phục hồi cơ sở dữ liệu bằng bí danh
Có thể phục hồi cơ sở dữ liệu bằng bí danh, được khai báo trong databases.conf (hoặc aliases.conf trong Firebird 2.5)
Ví dụ, chúng ta có khai báo sau
restdb=c:\Data\newrest1.fdb #Windows
restdb=/db/newrest1.fdb #Linux
Vì vậy, chúng ta có thể chạy lệnh sau để phục hồi bản sao lưu đến đường dẫn, được chỉ định bởi bí danh
Windows
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk restdb -user SYSDBA -pass masterkey
Linux
gbak -c -se localhost:service_mgr /db/backup1.fbk restdb -user SYSDBA -pass masterkey
2.7. Phục hồi bản sao lưu cục bộ đến máy chủ từ xa
Có thể phục hồi tệp sao lưu cục bộ đến máy chủ Firebird từ xa.
Trong ví dụ này, chúng ta phục hồi tệp sao lưu được lưu trữ trên Windows, đến máy chủ Linux (địa chỉ IP của nó là 102.168.0.108):
gbak -c C:\Data\backup1.fbk 192.168.0.108:/db/newdb1.fdb -user SYSDBA -pass masterkey
Thời gian phục hồi: 7009 giây
Như bạn có thể nhận thấy, quá trình phục hồi từ xa hoạt động rất chậm, chúng ta có thể tăng tốc nó với Service Manager không?
2.8. Phục hồi bản sao lưu cục bộ đến máy chủ từ xa với Service Manager
Để phục hồi bản sao lưu cục bộ trên máy chủ từ xa với Service Manager, cần phải thực hiện thủ thuật với luồng đầu vào stdin:
gbak -c -se 192.168.0.108:service_mgr -user SYSDBA -pass masterkey stdin /db/new3.fdb < C:\Data\backup1.fbk
Lệnh này gọi phục hồi trên máy chủ từ xa với đầu vào chuẩn stdin làm nguồn của bản sao lưu - và cung cấp đầu vào bằng phần < C:\Data\backup1.fbk của lệnh.
Trông có vẻ phức tạp? Nhưng đó là một cách dễ dàng để tăng hiệu suất gbak lên 10 lần khi phục hồi đến máy chủ từ xa!
Thời gian phục hồi: 450 giây
2.9. Phục hồi các bảng cực dài
Nếu bạn có một cơ sở dữ liệu thực sự lớn với tổng số hàng hơn 2 tỷ, cần phải chỉ định tùy chọn -o[ne_at_a_time], để phục hồi mỗi bảng trong một giao dịch riêng biệt, tránh một số tràn nội bộ.
gbak -c -se localhost:service_mgr -one C:\Data\backup1.fbk C:\data\new44.fdb -user SYSDBA -pass masterkey
3. Điều chỉnh và ghi nhật ký các quá trình sao lưu và phục hồi
3.1. Gbak với đầu ra chi tiết
Theo mặc định, gbak là một công cụ rất im lặng, nó không trả về gì trong trường hợp thực hiện thành công. Để làm cho nó chi tiết, chúng ta có thể thêm tùy chọn -v[erify]
gbak -b -se localhost/3050:service_mgr -g mydb1 c:\Data\backup1.fbk -v -user SYSDBA -pass masterkey
Kết quả là, sẽ có nhiều chi tiết hơn. Vấn đề nhỏ nhưng gây khó chịu là việc in đầu ra ra bảng điều khiển có thể làm cho sao lưu chi tiết chậm hơn đáng kể so với phiên bản im lặng, vì vậy ý tưởng tốt là lưu nhật ký vào tệp với tùy chọn - y logfile:
gbak -b -se localhost/3050:service_mgr -g -v mydb1 c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt
Lưu ý: gbak sẽ không ghi đè tệp nhật ký hiện có! Nếu bạn đã có C:\data\backuplog1.txt trong ví dụ này, việc sao lưu sẽ gây ra lỗi (xem #3 trong Phụ lục A).
Lưu ý 2: có tùy chọn -verbint để kiểm soát khoảng thời gian báo cáo số lượng bản ghi đã xử lý trong quá trình sao lưu hoặc phục hồi.
3.2. Thêm thống kê hiệu suất vào đầu ra chi tiết
Trong đầu ra chi tiết của gbak cho sao lưu và phục hồi, chúng ta có thể thấy các thông báo như thế này:
gbak: writing data for table COUNTRY
gbak:16 records written
cho mỗi bảng và các đối tượng cơ sở dữ liệu khác.
Thật thú vị để tìm ra bảng/đối tượng nào chiếm nhiều thời gian nhất, phải không?
Để làm điều này, cần phải sử dụng tùy chọn -st(atistics):
-ST(ATISTICS) TDRW show statistics:
T time from start
D delta time
R page reads
W page writes
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -st tdrw c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt
Khi được áp dụng, nó sẽ thêm vào nhật ký các cột sau:
gbak: time delta reads writes
vì vậy chúng ta sẽ có thể thấy thời gian và IO dành cho mỗi dòng.
3.3. Loại trừ các bảng khỏi sao lưu và/hoặc khỏi phục hồi
Nếu bạn nghĩ rằng một số bảng có thể được loại trừ khỏi sao lưu (một ví dụ điển hình là một bảng nhật ký rất dài), bạn có thể chỉ định chúng trong tham số SK[IP_DATA], với biểu thức chính quy làm tham số.
Trong ví dụ dưới đây, chúng ta loại trừ dữ liệu từ các bảng COUNTRY và JOB khỏi bản sao lưu:
gbak -b -se localhost/3050:service_mgr -g -v mydb1 -SKIP_D ‘(COUNTRY|JOB)’ c:\Data\backup1.fbk -user SYSDBA -pass masterkey -y C:\data\backuplog1.txt
Và, trong ví dụ dưới đây, chúng ta loại trừ bảng CLIENT khỏi quá trình khôi phục:
gbak -c -se localhost:service_mgr C:\Data\backup1.fbk C:\data\new33.fdb -user SYSDBA -pass masterkey -SKIP_D "CLIENT"
Xin lưu ý rằng tham số cho SKIP_DATA phải được truyền dưới dạng một tham số duy nhất, vì vậy nó phải được đặt trong dấu ngoặc kép!
Trên Linux, dấu ngoặc kép phải là dấu nháy đơn, trên Windows - dấu nháy kép.
Lưu ý khi loại trừ các bảng khỏi sao lưu và/hoặc khôi phục
Chúng tôi khuyên bạn nên kiểm tra điều kiện biểu thức chính quy trước khi sử dụng, bằng truy vấn sau - nó sẽ trả về danh sách các bảng tương ứng với điều kiện lọc (trong truy vấn, dấu ngoặc kép luôn là dấu nháy đơn)
SQL> SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE TRIM(RDB$RELATION_NAME) SIMILAR TO '(COUNTRY|JOB)';
RDB$RELATION_NAME
===============================
COUNTRY
JOB
Xin lưu ý rằng các bảng sẽ bị loại trừ khỏi sao lưu hoặc khôi phục bất kể các ràng buộc hiện có (Khóa ngoại), vì vậy, nếu bạn không lên kế hoạch cẩn thận cho việc loại trừ như vậy, rất dễ gặp phải lỗi “Cannot commit foreign key index” trong quá trình khôi phục.
3.4. Lấy mật khẩu cho sao lưu hoặc khôi phục từ tệp tin
Nếu bạn không thích ý tưởng để lộ mật khẩu cho tất cả những người xem lệnh của bạn, bạn sẽ thích tùy chọn sau: -fetch passwordfile
Hãy tạo tệp tin chứa mật khẩu tại C:\Data\passfile.txt và sử dụng nó (ở đây chúng ta sử dụng một biến thể nhúng rất đơn giản, tất nhiên, tùy chọn này cũng sẽ hoạt động với Service Manager):
gbak -b c:\Data\test1.fdb c:\Data\backup5.fbk -user SYSDBA -fetch C:\Data\passfile.txt
Có 2 lợi ích thực tế:
- Nếu chúng ta lưu mật khẩu trong một tệp tin duy nhất, chúng ta có thể đảm bảo rằng tất cả các tệp lệnh của chúng ta sẽ luôn sử dụng mật khẩu thực tế.
- Chúng ta không để lộ mật khẩu trong mọi tệp lệnh.
4. Sao lưu-khôi phục một bước
Thông thường, mục tiêu của việc sao lưu là thực hiện khôi phục ngay lập tức, để có được cơ sở dữ liệu mới, ví dụ, để áp dụng kích thước trang mới cho cơ sở dữ liệu, hoặc để di chuyển cơ sở dữ liệu hiện có từ 2.5 lên 3.0.
Trong trường hợp này, có thể thực hiện sao lưu-khôi phục bằng một lệnh duy nhất, sử dụng đầu vào và đầu ra chuẩn làm nguồn cho các lệnh thích hợp, để bỏ qua việc tạo tệp sao lưu trung gian, giảm yêu cầu về dung lượng trống và tăng tốc quá trình.
Lệnh như sau:
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout | gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb
Về bản chất, ở đây chúng ta thực hiện 2 lệnh, được nối với nhau bằng ký tự |,
lệnh đầu tiên để sao lưu ra stdout:
gbak -b -se localhost:service_mgr -g -user SYSDBA -password masterkey C:\Data\test1.fdb stdout
và lệnh thứ hai, để khôi phục từ stdin
gbak -c -se localhost:service_mgr -user SYSDBA -password masterkey stdin C:\Data\new10.fdb
Lệnh này là cách nhanh nhất để thực hiện sao lưu-khôi phục trên cùng một phiên bản Firebird.
Xin lưu ý: để chuyển đổi cơ sở dữ liệu bằng sao lưu-khôi phục một bước từ 2.5 lên 3.0, cần sử dụng 2 phiên bản Firebird, xem chi tiết tại đây.
5. Tóm tắt hiệu suất
Hình dưới đây chứa thông tin về tốc độ của các lệnh sao lưu khác nhau của sao lưu cục bộ cơ sở dữ liệu thử nghiệm:

Như bạn có thể thấy, cách nhanh nhất để sao lưu cục bộ là sử dụng Service Manager (tùy chọn -se[rvice]) và vô hiệu hóa thu gom rác (tùy chọn -ig).
Đối với sao lưu từ máy chủ từ xa đến máy cục bộ, Service Manager cũng là lựa chọn tốt nhất:

Tình hình với hiệu suất khôi phục cũng tương tự: Service Manager là cách nhanh nhất để khôi phục.

Đối với trường hợp khá hiếm gặp, khi khôi phục được thực hiện từ bản sao lưu cục bộ đến máy chủ từ xa, sử dụng Service Manager với thủ thuật stdin là lựa chọn khả thi duy nhất:

Câu hỏi rất thường gặp về VM và sao lưu Firebird
Tại sao tôi nên sử dụng các công cụ sao lưu Firebird, khi có các công cụ sao lưu phổ biến hứa hẹn sao lưu mọi thứ?
Hoặc, tôi sao lưu toàn bộ hình ảnh của Máy ảo, tại sao tôi phải bận tâm về việc sao lưu cơ sở dữ liệu Firebird?
Câu trả lời là tại đây.
Phụ lục A. Lỗi trong quá trình sao lưu/khôi phục
- Cố gắng chạy gbak mà không có tham số, hoặc với người dùng không phải chủ sở hữu cơ sở dữ liệu/không phải SYSDBA sẽ dẫn đến lỗi sau:
gbak: ERROR:Unable to perform operation. You must be either SYSDBA or owner of the database
gbak:Exiting before completion due to errors
- Nếu bạn chỉ định sai mật khẩu, sẽ có lỗi sau:
gbak: ERROR:Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
gbak:Exiting before completion due to errors
- Lỗi xảy ra khi tệp tin hiện có được chỉ định làm đích ghi nhật ký chi tiết
gbak: ERROR:cannot open status and error output file C:\data\backuplog1.txt
gbak: ERROR: Exiting before completion due to errors
gbak:Exiting before completion due to errors
- Lỗi xảy ra nếu cơ sở dữ liệu hiện có được chỉ định làm đích trong lệnh khôi phục gbak
gbak: ERROR:database C:\data\new1.fdb already exists. To replace it, use the -REP switch
gbak:Exiting before completion due to errors
- Lỗi xảy ra khi gbak cố gắng ghi bản sao lưu vào vị trí mà nó không có đủ quyền ghi.
gbak: ERROR:cannot open file /db/test1.fbk
gbak:Exiting before completion due to errors
- Khi gbak cố gắng truy cập tệp tin mà không có quyền truy cập - ví dụ, tệp tin có chủ sở hữu khác với người dùng “firebird” trên Linux
gbak: ERROR:no permission for read-write access to database /db/test1.fdb
gbak: ERROR: IProvider::attachDatabase failed when loading mapping cache
gbak:Exiting before completion due to errors
- Cố gắng sử dụng đầu ra chi tiết
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -user SYSDBA -pass masterkey /db/test1.fdb stdout >
c:\data\rembackup2.fbk
gbak: ERROR:standard output is not supported when using split operation or in verbose mode
gbak: ERROR: Exiting before completion due to errors
gbak:Exiting before completion due to errors
- Cố gắng sao lưu bằng Service Manager trên máy chủ từ xa với chế độ chi tiết được bật và lưu vào tệp nhật ký.
C:\HQbird\Firebird30>gbak -se 192.168.0.108:service_mgr -v -st tdrw -y lg1.txt -user SYSDBA -pass masterkey /db/test1.f
db stdout > c:\data\rembackup2.fbk
gbak: ERROR:Invalid clumplet buffer structure: string length doesn't match with clumplet
gbak:Exiting before completion due to errors
- Lỗi trong sao lưu-khôi phục một bước khi sao lưu thất bại vì một lý do nào đó:
gbak: ERROR:No request from user for stdin data
gbak:Exiting before completion due to errors
- Nếu bạn đang cố gắng truyền dữ liệu không phải bản sao lưu cho gbak
gbak: ERROR:unavailable database
gbak:Exiting before completion due to errors
gbak: ERROR:expected backup description record
gbak:Exiting before completion due to errors
- Sao lưu tệp cơ sở dữ liệu bị hỏng với trang sai sẽ báo lỗi sau (số và tệp cơ sở dữ liệu sẽ khác nhau, tất nhiên)
gbak: ERROR:database file appears corrupt (E:\DATABASE1.FDB)
gbak: ERROR: wrong page type
gbak: ERROR: page 9294588 is of wrong type (expected 8, found 0)
gbak: ERROR:gds_$get_segment failed
gbak:Exiting before completion due to errors
gbak: ERROR:Unexpected I/O error while reading from backup file
gbak:Exiting before completion due to errors
Liên hệ
Vui lòng liên hệ với chúng tôi nếu có bất kỳ câu hỏi nào, hoặc báo cáo bất kỳ lỗi hoặc lỗi chính tả nào: [email protected]