Kiểm tra cấu trúc và mã cho Oracle sau quá trình di chuyển từ Oracle sang Amazon Relational Database Service (Amazon RDS) for Oracle

bởi Lokesh Gurram và Suhas Basavaraj | vào ngày 28 tháng 12 năm 2023 |

Hầu hết các quá trình di chuyển từ Oracle trên nền tảng on-premises sang Amazon Relational Database Service (Amazon RDS) for Oracle thường sử dụng EXPDP/IMPDB hoặc Transportable Tablespaces sử dụng RMAN. Tùy thuộc vào kích thước và độ phức tạp, quá trình di chuyển thường được chia thành cấp độ schema và cấp độ bảng.

Trong bài đăng này, chúng tôi giới thiệu một giải pháp để giúp bạn xác định các đối tượng schema thiếu sót trong cơ sở dữ liệu đích sau quá trình di chuyển và xác định bất kỳ vấn đề nào. Chúng tôi sử dụng một công cụ để so sánh các đối tượng schema Oracle trong cơ sở dữ liệu nguồn với các đối tượng schema trong cơ sở dữ liệu đích và cung cấp danh sách các đối tượng thiếu sót dưới định dạng HTML. Chúng tôi cũng thảo luận về các loại vấn đề mà bạn có thể gặp trong quá trình di chuyển và cách công cụ này có thể giúp bạn khắc phục lỗi di chuyển một cách tích cực.

Lý do để kiểm tra

Oracle là một cơ sở dữ liệu phức tạp với nhiều tính linh hoạt, và do độ rộng của các tính năng, có thể cần kiểm tra các đối tượng của bạn. Dưới đây là một số lý do phổ biến tại sao việc nhập/xuất có thể yêu cầu kiểm tra bổ sung:

  • Khi chúng tôi thực hiện xuất toàn bộ cơ sở dữ liệu từ cơ sở dữ liệu Enterprise Edition (EE) 11g và chỉ nhập các schema được chọn vào cơ sở dữ liệu Standard Edition (SE) 19C, chúng tôi nhận được các lỗi ORA-39014: Một hoặc nhiều worker đã kết thúc trước thời gian và ORA-39029: Worker 1 với tên quy trình “DW00” đã kết thúc trước thời gian. Điều này là một hạn chế của quá trình xuất và nhập. Do đó, chúng tôi phải thực hiện xuất các schema được chọn từ cơ sở dữ liệu EE 11g vào cơ sở dữ liệu SE 19C.
  • Xuất không nắm bắt được một số loại đối tượng, chẳng hạn như các câu lệnh ALTER TYPE cho CREATE TYPES trong các bản xuất, nên chúng cần được chuyển qua bằng cách thủ công:

create or replace type “typ_name” as  object

                   (sno number

                   ,name varchar2(10)

                   );

                   /

     ALTER TYPE “typ_name” ADD ATTRIBUTE emp_location varchar2(38) CASCADE;

     /

  • Xuất và nhập cấp độ schema của các đối tượng vào cơ sở dữ liệu đích sẽ giảm thiểu thời gian ngừng hoạt động. Tuy nhiên, sẽ có nhiều lỗi trong quá trình expdp/impdp. Việc xem xét và xác định lỗi là một công việc khó khăn. Do đó, bản báo cáo tồn tại này giúp bạn tìm thấy bất kỳ đối tượng nào bị thiếu sót.
  • Khi không có thời gian ngừng hoạt động cho cơ sở dữ liệu nguồn, bạn sẽ sử dụng AWS Database Migration Service (AWS) DMS hoặc Oracle GoldenGate. Nếu bất kỳ câu lệnh DDL nào không được hỗ trợ bởi các công cụ, giải pháp của chúng tôi có thể giúp bạn tìm thấy những đối tượng bị thiếu sót như vậy.
  • Đôi khi, chúng tôi tắt các trigger và ràng buộc khóa ngoại tại cơ sở dữ liệu đích trong quá trình di chuyển dữ liệu và kích hoạt chúng sau quá trình di chuyển. Công cụ này có thể nắm bắt bất kỳ đối tượng bị thiếu sót nào để kích hoạt.
  • Nếu mã nguồn của cơ sở dữ liệu nguồn đã được bọc (sử dụng DBMS_DDL.WRAP), việc nhập dữ liệu vào cơ sở dữ liệu đích sẽ thất bại nếu bạn thiếu bản vá Oracle 20594149. Hãy đảm bảo rằng bản vá 20594149 đã được áp dụng trước.
  • Nếu cơ sở dữ liệu đích là Amazon RDS và thiếu bất kỳ bản vá nào (ví dụ: bản vá Patch 8795792), quá trình nhập có thể gây ra lỗi tạo chỉ mục.
  • Nếu chúng ta bỏ qua việc thiết lập một tham số cấu hình tĩnh tương tự như cơ sở dữ liệu nguồn, cơ sở dữ liệu cần phải khởi động lại sau khi hoàn tất việc chuyển giao.
  • Sẽ có các đối tượng không hợp lệ nếu bạn di chuyển cơ sở dữ liệu bằng cách sử dụng expdp/impdp ở cấp độ schema và cấp độ bảng. Theo đối tượng không hợp lệ, chúng thường có nghĩa là các loại đối tượng khác nhau như các từ viết tắt, chức năng, gói, thủ tục và xem có liên kết với các đối tượng không tồn tại hoặc liên kết với các đối tượng đã thay đổi một cách nào đó hoặc được xây dựng theo một thứ tự khác nhau.
  • Đường liên kết cơ sở dữ liệu từ nguồn cần được xem xét. Nếu cơ sở dữ liệu nguồn ở trong nhà, đường liên kết cơ sở dữ liệu sẽ kết nối với cơ sở dữ liệu cũ sau quá trình di chuyển và do đó cần phải được cập nhật thủ công.
  • Một hồ sơ SQL là một bộ sưu tập thông tin được lưu trữ trong từ điển dữ liệu giúp trình tối ưu hóa truy vấn tạo một kế hoạch chạy tối ưu cho một câu lệnh SQL. Hồ sơ SQL chứa các sửa đổi cho các ước lượng trình tối ưu hóa kém chất lượng được phát hiện trong quá trình tối ưu hóa SQL tự động. Trong quá trình di chuyển, nếu bạn không di chuyển các hồ sơ SQL, điều này có thể dẫn đến vấn đề hiệu suất.

Tổng quan về giải pháp

Công cụ kiểm tra sự hợp lý của đối tượng sau quá trình di chuyển từ Oracle sang Oracle hoạt động cho các trường hợp sử dụng sau từ Oracle 12C trở lên:

  • Oracle trên on-premises đến Oracle trên Amazon Elastic Compute Cloud (Amazon EC2) và ngược lại
  • Oracle trên on-premises đến Amazon RDS for Oracle và ngược lại
  • Oracle trên Amazon EC2 đến Amazon RDS for Oracle và ngược lại
  • Sử dụng script này cho các schema ứng dụng thay vì so sánh schema SYS hoặc SYSTEM.

Biểu đồ dưới đây mô tả kiến trúc giải pháp và các dịch vụ AWS được sử dụng trong bài đăng này.

Yêu cầu

Để thực hiện theo bài đăng này, bạn cần các yêu cầu tiên quyết sau:

  • Một máy chủ EC2 hoặc máy chủ bastion kết nối với cơ sở dữ liệu nguồn và cơ sở dữ liệu đích
  • Quyền truy cập vào siêu dữ liệu của cơ sở dữ liệu nguồn và cơ sở dữ liệu đích với quyền SELECT_CATALOG_ROLE hoặc DBA
  • SQL *Plus
  • SQL *Loader
  • Sao chép repo GitHub và cung cấp quyền chmod 755 cho các tệp tin
  • Đảm bảo bạn có kết nối đến cơ sở dữ liệu nguồn và cơ sở dữ liệu đích từ không gian làm việc của bạn nếu chế độ chạy được chọn là sql_ldr
  • Đảm bảo bạn chỉ có kết nối đến cơ sở dữ liệu đích từ không gian làm việc của bạn nếu chế độ chạy được chọn là db_link
  • Xác nhận đối tượng

Bảng dưới đây tóm tắt các đối tượng Oracle và các trường xác nhận.

Oracle ObjectsValidation Fields
Schema listSchema name, profile, status
Object typesDatabase object types, attributes, attribute position, data type, data type length
SequencesSequence start position, last number, min value, max value, status, is_cycle, cache_size
TablesTables, column names, column position, column data type, data length
Table partitionsTable name, table owner, partition name
ConstraintsConstraint name, attribute, attribute type, position, status
IndexesIndex name, index column name, column position, index schema, status
Index partitionsIndex name, partition name, status
ViewsView name, number of lines of code
SynonymsSynonym name, table name, database link
TriggersTrigger name, table owner, table name, trigger type, status
Scheduler jobsScheduler job names, state
QueuesQueue name, queue table, queue type, enqueue enabled, dequeue enabled
RuleRule name, rule owner, rule status
JavaObject name, object owner
Scheduled programsProgram name, owner, status
Database linksDatabase link name, user, host details
Code line countVerifying the number of lines count for every code object
Invalid listObject name, object type, owner
Oracle patchesPatch ID, status
Oracle parametersParameter name, inst_id, default value, values
SQL profilesProfile name, status
RolesRole name
Roles and privilegesGrantee, granted, admin options
System privilegesGrantee, privilege, admin options
Table statisticsTable name, number of rows
LOB objectsOwner, table name, column name
DB profilesProfile name, resource name
Objects countObject type, count, owner combination

Thực hiện xác nhận schema

Quá trình di chuyển cơ sở dữ liệu là một quá trình đa bước, thường bao gồm đánh giá, di chuyển schema, di chuyển dữ liệu, kiểm thử và nhiều bước khác trải dài qua các giai đoạn. Kích thước và loại di chuyển cơ sở dữ liệu Oracle bạn muốn thực hiện quyết định lớn về các công cụ bạn nên sử dụng. Đối với cơ sở dữ liệu Oracle, chúng ta có thể sử dụng các công cụ native như export và import, và các công cụ AWS như AWS DMS.

Danh sách công việc sau đây cho thấy khi nào bạn nên thực hiện xác nhận schema trong quá trình di chuyển của bạn:

  1. Cấu hình máy chủ cơ sở dữ liệu nguồn Oracle.
  2. Cấu hình máy chủ cơ sở dữ liệu đích Oracle.
  3. Thực hiện quá trình di chuyển mã nguồn bằng quy trình xuất và nhập.
  4. Thực hiện xác nhận schema và mã nguồn.

Để xác nhận chuyển đổi schema, so sánh các đối tượng được tìm thấy trong cơ sở dữ liệu Oracle nguồn và cơ sở dữ liệu Oracle đích bằng cách sử dụng trình chỉnh sửa truy vấn ưa thích của bạn.

Phương pháp xác nhận tiêu chuẩn so sánh số đếm của đối tượng trong cơ sở dữ liệu nguồn với số đếm trong cơ sở dữ liệu đích. Bạn có thể thực hiện xác nhận số đếm cho bất kỳ đối tượng schema nào, nhưng xác nhận số đếm một mình không luôn đáp ứng mong muốn của người dùng cuối. Trong phần trước đó nói về lý do cần phải xác nhận, chúng ta đã thảo luận về lý do tại sao chúng ta cần phải vượt xa việc xác nhận số đếm. Người dùng thường tìm kiếm xác nhận ở mức định nghĩa đối tượng. Đây là lý do tại sao bạn phải viết các truy vấn tùy chỉnh của mình để truy xuất ngôn ngữ định nghĩa dữ liệu (DDL) từ cơ sở dữ liệu và so sánh chúng.

Trong phần này, chúng tôi sẽ hướng dẫn bạn qua các bước để thực hiện xác nhận schema:

  1. Sau khi di chuyển cơ sở dữ liệu nguồn Oracle đến cơ sở dữ liệu Oracle đích, việc xác nhận danh sách schema tại nguồn và đích là quan trọng để đảm bảo không có mất mát đối tượng. Sử dụng truy vấn Oracle sau để so sánh chi tiết danh sách schema:

select username,profile, password_versions , account_status from dba_users where username IN  (‘schema1′,’schema2’,..)

Thay thế tên người dùng Oracle của bạn vào truy vấn ví dụ trên thay vì schema_name. Nếu bạn loại bỏ bất kỳ schema nào khỏi di chuyển trong cơ sở dữ liệu nguồn hoặc giới thiệu một schema trong cơ sở dữ liệu đích, hãy loại trừ những schema đó bằng cách thêm bộ lọc WHERE vào các truy vấn trước và sau đây.

  1. Là một phần của việc xác nhận schema, bạn nên xác nhận danh sách các loại đối tượng và thông tin liên quan đến thuộc tính của nó trong cơ sở dữ liệu nguồn và đích để đảm bảo không có mất mát dữ liệu. Sử dụng truy vấn Oracle sau để so sánh chi tiết loại đối tượng:

SELECT owner,type_name,attr_name,attr_type_name,replace(‘(‘|| nvl(length, nvl(precision, 0)) || ‘)’, ‘(0)’, ”) attr_lenght,attr_no FROM dba_type_attrs WHERE owner in (schema_name);

  1. Xác nhận chuỗi số với đoạn mã sau:

SELECT c.sequence_owner,c.sequence_name,to_char(c.min_value),to_char(c.max_value),to_char(c.increment_by),to_char(c.cycle_flag),to_char(c.cache_size),to_char(c.last_number) 

FROM dba_sequences c 

WHERE sequence_owner in (schema_name) 

  1. Xác nhận bảng

SELECT c.owner, c.table_name, c.column_name ,

c.data_type|| ‘(‘|| c.char_length||CASE WHEN c.char_used = ‘C’ THEN ‘ CHAR’ WHEN c.char_used = ‘B’ THEN ‘ BYTE’ ELSE NULL END|| ‘)’ data_type, c.column_id col_position

FROM dba_tab_cols c, dba_tables t

WHERE c.column_id IS NOT NULL

AND c.owner in (schema_name)

AND t.owner = c.owner

AND c.hidden_column = ‘NO’

AND t.table_name = c.table_name

  1. Xác nhận phân vùng bảng:

select table_owner , table_name, partition_name, from dba_tab_partitions where table_owner in (‘schema_name’);

  1. Xác nhận ràng buộc:

SELECT c.owner,c.table_name,,c.constraint_name,c.column_name,s.constraint_type,c.position,

s.status

FROM dba_cons_columns c,dba_constraints s

WHERE s.table_name = c.table_name

AND c.owner = s.owner

AND c.constraint_name = s.constraint_name

AND c.constraint_name NOT LIKE ‘BIN%’

AND c.constraint_name NOT LIKE ‘SYS_%’

AND c.table_name NOT LIKE ‘BIN%’

AND c.table_name NOT LIKE ‘SYS%’

AND c.owner IN (schema_name)

  1. Xác nhận chỉ mục:

SELECT

c.table_owner,c.table_name,c.index_owner,c.index_name,c.column_name,

c.column_position,i.status

FROM dba_indexes i, dba_ind_columns c

WHERE i.index_name = c.index_name

AND i.owner = c.index_owner

AND i.table_owner = c.table_owner

AND i.table_name = c.table_name

AND i.table_name NOT LIKE ‘SYS%’

AND i.table_name NOT LIKE ‘BIN%’

AND i.index_name NOT LIKE ‘SYS%’

AND i.index_name NOT LIKE ‘BIN%’

AND i.owner in (schema_name)

  1. Xác nhận các phân vùng chỉ mục:

select index_owner,index_name,partition_name,status

from DBA_IND_PARTITIONS where index_owner in (schema_name)

  1. Xác nhận các chế độ xem (views):

select owner,view_name,text_length from dba_views where owner in (schema_name)

  1. Xác nhận các đồng nghĩa (synonyms):

select owner,synonym_name,table_owner,table_name,db_link from dba_synonyms where owner in (‘schema_name’)

  1. Xác nhận các triggers:

select owner,trigger_name,table_owner, table_name,triggering_event,trigger_type,status from dba_triggers where owner in (schema_name)

  1. Xác nhận các công việc lập lịch:

select owner,job_name,state from dba_scheduler_jobs where owner in (schema_name)

  1. Xác nhận các hàng đợi:

select owner,name,queue_table,queue_type,ENQUEUE_ENABLED,DEQUEUE_ENABLED 

from DBA_QUEUES where owner in (schema_name)

  1. Xác nhận các quy tắc (rules):

select  owner,object_name,object_type,status from dba_objects where owner in (schema_name) and object_type LIKE ‘RULE%’

  1. Xác nhận các đối tượng Java:

select  owner,object_name,object_type,status from dba_objects where owner in (schema_name) and object_type LIKE ‘JAVA%’

  1. Xác nhận các chương trình được lập lịch:

select owner,program_name, program_type, enabled

from DBA_SCHEDULER_PROGRAMS where owner in (‘schema_name’) 

  1. Xác nhận các liên kết cơ sở dữ liệu:

SELECT owner, db_link, username, chr(34)||replace(trim(host),chr(10),”)||chr(34) host_details

FROM dba_db_links

  1. Xác nhận số dòng code trong các đối tượng code:

select owner, name, type, count(line) from dba_source where owner in (schema_name) group by owner,name,type

  1. Xác nhận danh sách không hợp lệ:

select owner, object_name, subobject_name,object_type,status FROM dba_objects WHERE status=’INVALID’

AND owner in (schema_name)

  1. Xác nhận các bản vá của Oracle:

select patch_id from dba_registry_sqlpatch

  1. Xác nhận các tham số của Oracle:

SELECT inst_id,name,DISPLAY_VALUE,DEFAULT_VALUE,value

FROM gv$parameter

  1. Xác nhận các hồ sơ SQL:

SELECT name, status FROM dba_sql_profiles

  1. Xác nhận các vai trò:

SELECT role,password_required, AUTHENTICATION_TYPE, common, oracle_maintained FROM dba_roles

  1. Xác nhận vai trò và đặc quyền:

SELECT grantee,granted_role,admin_option

FROM dba_role_privs

  1. Xác thực đặc quyền hệ thống:

SELECT grantee, admin_option ROM dba_sys_privs

  1. Xác nhận thống kê của bảng:

select s.owner, s.table_name,

decode(nvl(s.num_rows,0),0,0, s.num_rows) num_rows

from dba_tables s

where s.owner in (schema_name)

  1. Xác nhận các đối tượng lớn (LOBs):

select l.owner, l.table_name, l.column_name, sum(sg.bytes) bytes

from dba_lobs l, dba_segments sg

where l.owner=sg.owner and l.segment_name=sg.segment_name

and l.owner in (schema_name)

group by l.owner,l.table_name,l.column_name

  1. Xác thực hồ sơ DB:

select profile,resource_name from dba_profiles;

  1. Xác thực số lượng đối tượng theo loại đối tượng:

SELECT COUNT(DISTINCT object_name) cnt,

object_type,owner 

FROM dba_objects WHERE object_name NOT LIKE ‘/%’

AND object_name NOT LIKE ‘BIN%’

AND object_name NOT LIKE ‘SYS%’

AND owner in (schema_name)

GROUP BY owner, object_type

Sử dụng công cụ kiểm tra tính toàn vẹn sau di cư

Công cụ kiểm tra tính toàn vẹn sau di cư chạy các truy vấn trước đó trong cơ sở dữ liệu nguồn và đích, và cung cấp sự khác biệt dưới dạng HTML. Bạn có thể chạy công cụ ở hai chế độ khác nhau:

  • sql_ldr (Oracle SQL Loader) – Đoạn mã script sau đây là an toàn và không cần lưu trữ mật khẩu; nó sẽ yêu cầu mật khẩu:

$ sh oracle_to_oracle_object_sanity.sh 

“C:\AZ_WorkSpace\PRJ\git\oracle_to_oralce_codesanity\env.par”

 Enter the mode of execution. Example: db_link or sql_ldr

 Mode of execution:

 Execution mode entered is: sql_ldr

 Enter Source DB Password:

 Enter Target DB Password:

  • db_link (Oracle DB Link) – Tương tự, đoạn mã script sau đây sẽ yêu cầu mật khẩu:

$ sh oracle_to_oracle_object_sanity.sh “C:\AZ_WorkSpace\PRJ\git\oracle_to_oralce_codesanity\env.par”

Enter the mode of execution. Example: db_link or sql_ldr

Mode of execution:

Execution mode entered is: db_link

Enter Target DB Password:

Để biết hướng dẫn chi tiết từng bước để chạy công cụ, tham khảo tệp README.

Các bức ảnh màn hình dưới đây thể hiện một ví dụ của báo cáo toàn vẹn HTML.





Tất cả các loại đối tượng được thảo luận trong bài viết này đã được bao gồm trong bản kiểm tra toàn vẹn HTML. Tham khảo kho GitHub để xem mẫu báo cáo toàn vẹn đầy đủ.

Báo cáo HTML bao gồm hai bộ kết quả:

  • Nguồn So với Đích – Cung cấp chi tiết về các đối tượng tồn tại trong nguồn nhưng không tồn tại trong đích
  • Đích So với Nguồn – Cung cấp chi tiết về các đối tượng tồn tại trong đích nhưng không tồn tại trong nguồn

Dọn dẹp

Do giải pháp này chạy trên máy chủ Amazon EC2 hoặc máy chủ bastion, nên cần phải dọn dẹp các dịch vụ AWS. Đoạn mã cũng có một tính năng để tải lên báo cáo lên Amazon Simple Storage Service (Amazon S3).

Tóm tắt

Bài viết này giới thiệu một công cụ kiểm tra tính toàn vẹn sau di cư và thể hiện cách nó có thể giúp làm người xác minh lược đồ và mã cho các dự án di cư Oracle-to-Oracle.

Chúng tôi mạnh mẽ khuyến nghị đọc kỹ giải pháp này và triển khai nó khi cần thiết. Nếu bạn có bất kỳ câu hỏi hoặc ý kiến nào về bài viết này, hãy chia sẻ ý kiến của bạn trong phần bình luận.

Về Tác giả

Lokesh Gurram là một Chuyên viên Chính với AWS ProServe, GCC India. Anh ấy hỗ trợ và giúp khách hàng di chuyển máy chủ và cơ sở dữ liệu đến AWS. Anh ấy thích làm việc theo chiều ngược và tự động hóa các quy trình thủ công để cải thiện trải nghiệm người dùng với ít phiền toái nhất. Trọng tâm chính của anh ấy là di cư đồng nhất và không đồng nhất của cơ sở dữ liệu on-premises đến Amazon RDS cùng với các giải pháp tự động hóa di chuyển đầy đủ.

Suhas Basavaraj là một Chuyên viên Chính với AWS ProServe, GCC India. Anh ấy đang làm việc như là Điều hướng Di cư Cơ sở dữ liệu, giúp đỡ và kích thích khách hàng trong di cư đồng nhất và không đồng nhất từ on premises đến Amazon RDS. Anh ấy đam mê về tự động hóa và xây dựng các giải pháp để tăng tốc di cư cơ sở dữ liệu.