Tăng tốc export import

   Giới thiệu

 

Export và Import dữ liệu (bằng công cụ Datapump) từ database này sang database khác, là một trong những công việc hay làm nhất của 1 Database Administrator (DBA).

 

Công việc này có thể tốn kha khá thời gian của các bạn.

 

Trong bài viết này, tôi xin chia sẻ 1 số kinh nghiệm của tôi để tăng tốc độ Export và Import bằng Datapump cho Oracle database nhé.

 

Chú ý: Để đọc bài viết 1 các hiệu quả nhất, bạn nên biết cách sử dụng Datapump cơ bản trước đó rồi.

Nếu chưa, hãy search các bài viết hướng dẫn về Datapump trên google trước đã, rồi hãy đọc bài viết này.

 


 

   Tăng tốc độ export

 

Đầu tiên là các mẹo để tăng tốc độ export

 

   Sử dụng PARALLEL

 

Một trong những cách hiệu quả nhất để tăng tốc độ export, đó là sử dụng option PARALLEL.

 

Việc này sẽ tăng số luồng export thay vì chỉ có 1 luồng như mặc định.

 

Song song với việc sử dụng option PARALLEL, ở option DUMPFILE bạn cũng phải đặt tên file kèm với tham số %U để mỗi luồng sẽ ghi ra 1 file riêng biệt.

 

VD: DUMPFILE=table%U.dmp và PARALLEL=4

thì các file export ra sẽ có tên như sau:

table01.dmp

table02.dmp

table03.dmp

table04.dmp

 

   Sử dụng COMPRESSION=ALL

 

Option COMPRESSION=ALL sẽ giúp nén file export để dung lượng của nó nhỏ hơn. Việc nén này có thể tốn thêm 1 chút xử lý của CPU, tuy nhiên, do dung lượng sau khi nén đã nhỏ đi, nên thời gian ghi xuống đĩa sẽ nhanh hơn nhiều.

 

Tôi rất hay dùng option này và thấy nó thực sự khá hiệu quả.

 

   Sử dụng CLUSTER=N và PARALLEL_FORCE_LOCAL=TRUE

 

Trong môi trường RAC, khi bạn export dữ liệu, mặc định các instance của RAC sẽ cùng thực hiện export. Điều này nghe có vẻ khá tốt đúng không?

Đọc thêm  Các thuật ngữ thường dùng trong chiến lược backup database

 

Tuy nhiên, không phải lúc nào nhiều cũng thắng được ít. Việc các tiến trình export nằm trên các instance khác nhau, khiến việc phối hợp giữa chúng sẽ khó khăn hơn, so với việc tất cả tiến trình cùng nằm trên 1 instance.

 

   Sử dụng EXCLUDE=STATISTICS

 

Khi các bạn thực hiện export dữ liệu, mặc định, statistics của đối tượng cũng sẽ được export theo.

 

Việc này đôi khi không cần thiết!

 

Nguyên nhân là vì: Sau khi bạn import dữ liệu xong, bạn vẫn phải cần 1 lần nữa gather lại toàn bộ các bảng vừa import, vì statistics của database cũ không có gì đảm bảo sẽ tối ưu cho database mới được!

 

Do đó, tôi khuyến nghị bạn nên sử dụng option EXCLUDE=STATISTICS để loại bỏ statistics ra khỏi bản export.

 

   Sử dụng EXCLUDE=INDEX

 

Option này sẽ không export index của các bảng ra nữa.

 

Trong trường hợp bạn cần export dữ liệu thật nhanh. Cách tiếp cận đơn giản nhất là: Chỉ export những thứ cần thiết!

 

Bạn hoàn toàn có thể tạo lại index bằng tay ở trên database đích, sau khi đã import xong cơ mà. Vậy bạn cần export index để làm gì?

 

   Chạy Gather dictionary trước khi export

 

Tiến trình export cần truy vấn các thông tin về cấu trúc của đối tượng export (VD: Các cột của table, các index, constraint liên quan, số dòng dữ liệu…). Các thông tin này sẽ được lưu tại data dictionary.

 

Do đó, chúng ta cần gather lại dictionary để giúp export chạy nhanh hơn.

 

EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS (NULL);
EXEC DBMS_STATS.GATHER_SYSTEM_STATS;
EXEC DBMS_STATS.GATHER_DICTIONARY_STATS;

 

   Export dữ liệu vào phân vùng có tốc độ ghi cao

 

Điều này rất đơn giản nhưng đôi khi các bạn mới vào nghề rất hay mắc phải.

 

Bạn nào đã từng export dữ liệu thẳng vào 1 ổ đĩa USB 2.0, hãy comment cho tôi biết nhé.

 

Nói chung lời khuyên là: Hãy chọn phân vùng có tốc độ ghi tốt để export dữ liệu vào đó, tốt nhất là SSD.

 


 

   Tăng tốc độ import

 

Thời gian import thường lâu hơn export khá nhiều, khoảng từ 2-5 lần.

 

Sau đây là 1 số mẹo tôi thường dùng để tăng tốc độ import.

 

   Cấp phát trước dung lượng cho datafile

 

Thay vì tạo datafile theo kiểu AUTOEXTEND, tôi sẽ sử dụng FIXED SIZE cho datafile. (VD: Tôi tạo datafile với kích thước được cấp phát sẵn là 32GB). Làm như vậy, khi import dữ liệu, sẽ không mất thời gian extend datafile nữa.

Đọc thêm  Export Import dữ liệu cơ bản bằng pg_dump trong PostgreSQL

 

Nhiều bạn có thể thắc mắc: Làm như vậy có thể khiến lãng phí dung lượng lưu trữ thì sao?

 

Đồng ý với bạn điểm này, tuy nhiên, nếu chúng ta muốn tăng tốc độ thì cần phải đánh đổi thôi.

 

   Đưa database về NOLOGGING

 

Khi import dữ liệu, redo log sẽ sinh ra rất nhiều, việc này gây ra 2 vấn đề:

 

Tăng thời gian import do cần ghi thông tin redo log quá nhiều.

 

Do redo log sinh ra nhiều nên tần suất switch log cũng tăng cao, tỷ lệ thuận với việc tần suất checkpoint cũng tăng theo –> Tốc độ giảm

 

Do đó, có một giải pháp là đưa database về chế độ No Archive log, để hạn chế các thông tin được ghi vào redo log.

 

Cách này khá hiệu quả trong việc tăng tốc độ import, tuy nhiên, có thể có 1 số rủi ro về an toàn cho database. Bạn nên cân nhắc nó.

 

Chú ý: Từ bản 12c trở đi, bạn có thể sử dụng option sau để job import không sinh ra quá nhiều redo log nữa:

 

TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y

 

   Tăng kích thước Redo log group

 

Như tôi đã nói ở trên, việc redo log sinh ra quá nhiều, dẫn đến tần suất switch log tăng cao, tỷ lệ thuận với tần suất checkpoint.

 

Để giảm tần suất checkpoint, bạn hãy tăng kích thước của Redo log group lên, để giảm tần suất switch log.

 

Cách làm này cũng khá hiệu quả đó.

 

   Sử dụng PARALLEL

 

Muốn import nhanh, không thể không nhắc tới option PARALLEL này. Có lẽ tôi không cần nói gì thêm vì tính hiệu quả của nó nữa.

 

Tuy nhiên, bạn cần chú ý, lúc Export bạn cũng phải dùng PARALLEL, thì lúc IMPORT dùng PARALLEL mới hiệu quả được nhé.

 

   Sử dụng Exclude=constraint

 

Với dữ liệu cần import có nhiều constraint, cũng khiến cho việc import mất thêm nhiều thời gian hơn. Bạn hoàn toàn có thể sử dụng option EXCLUDE=CONSTRAINT để không tạo constraint khi import. Sau khi import xong xuôi, bạn mới tạo constraint lại.

 

Lúc tạo lại constraint, bạn có thể kết hợp với option NOVALIDATE để tạo constraint nhanh hơn.

 

   Tăng pga_aggregate_target

 

Nếu trong câu lệnh import, bạn vẫn cho phép import cả Index, thì lúc tạo index, PGA sẽ sử dụng nhiều để sắp xếp dữ liệu.

 

Việc tăng PGA bằng cách tăng tham số PGA_AGGREGATE_TARGET nhằm mục đích mở rộng Cache để việc sắp xếp dữ liệu trên Memory được nhanh hơn.

Đọc thêm  Tổng quan về kiến trúc Oracle Database

 

 

   Use large Undo tablespace & temporary tablespace

 

Việc tăng kích thước của UNDO và TEMP tablespace cũng có thể tăng tốc độ import, tuy nhiên, không cải thiện được quá nhiều.

 

Trên đây là các kinh nghiệm của tôi, bạn còn mẹo này nữa, hãy chia sẻ nhé.

 

   Hãy tham gia group “Kho tài liệu kiến thức database” để cùng học hỏi và chia sẻ nhé.

   Tặng bạn khoá học “Linux thật là đơn giản” hoàn toàn miễn phí. Khoá học này sẽ giúp bạn nắm được các kiến thức quan trọng nhất để học tập các kỹ năng cao hơn về Database.

Nguồn: https://dangxuanduy.com/

 

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments