Mục lục

1. Giới thiệu

Export và Import dữ liệu (bằng công cụ Data Pump) 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 Data Pump 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ề Data Pump trên google trước đã, rồi hãy đọc bài viết này.

 

2. Tăng tốc độ export

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

 

1. 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

 

2. 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ả.

 

3. 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?

 

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.

Đọc thêm  Case study: Khôi phục Oracle database khi server bị hỏng hoàn toàn

 

4. 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.

 

5. 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ì?

 

6. 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;

 

7. 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.

 

2. 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 thêm  Hướng dẫn cài đặt PostgreSQL trên CentOS 7

 

1. 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.

 

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.

 

2. Đư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

 

3. 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ả đó.

 

4. 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.

Đọc thêm  Bí kíp Linux #8: Tìm nguyên nhân hệ điều hành bị chậm bằng vmstat

 

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é.

 

5. 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.

 

6. Tăng giá trị tham số khởi tạo 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.

 

7. Tăng kích thước Undo tablespace và 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é.

 

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

Hiện tại, tôi có tổ chức đều đặn các khóa học về quản trị Oracle Database, tôi sẽ để thông tin ở đây, để bạn nào quan tâm về lịch học cũng như chương trình học có thể theo dõi nhé.

KHOÁ DÀNH CHO NGƯỜI MỚI

KHÓA HỌC: QUẢN TRỊ ORACLE DATABASE THẬT LÀ ĐƠN GIẢN (ADMIN 1)

CÁC KHOÁ NÂNG CAO:

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ KIẾN TRÚC MULTITENANT 12c

KHÓA HỌC ORACLE NÂNG CAO: QUẢN TRỊ HỆ THỐNG DATA GUARD

CÁC KHOÁ COMBO:

COMBO 1: ADMIN 1 + MULTITENANT 12c

COMBO 2: ADMIN 1 + DATA GUARD

COMBO 3: ADMIN 1 + MULTITENANT 12c + DATA GUARD

LỊCH HỌC:

Mời bạn xem tại đây: LỊCH HỌC CÁC LỚP ORACLE 

ĐĂNG KÝ:

https://forms.gle/MtCAoRQFenP886y79

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é.

 

0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
1 Comment
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
An Nhiên
2 năm trước

cách này áp dụng hay quá ạ

1
0
Rất thích suy nghĩ của bạn, hãy bình luận.x