Oracle Database DMS Checker
This script checks an Oracle database compatibility for DMS, generating a report in either text or HTML format. It's designed to assist in verifying the readiness of a database for GCP Data Migration Service (DMS) processes.
Features
- Configuration-driven: Uses a YAML configuration file to define the database checks to perform. This allows for easy customization and maintenance. Simply use --config option to provide a custom yaml.
- Secure password handling: Supports password retrieval from Google Cloud Secret Manager, enhancing security. Alternatively, you can directly provide the password as a command-line argument.
- Flexible output: Generates reports in both text and HTML formats. The HTML report includes styling for improved readability.
- Error handling: Includes basic error handling for missing environment variables and connection issues.
Requirements
- Python 3.9+: The script is written in Python and requires Python 3.9 or higher.
Setup
pip install dms_check
- Install dependencies: Install the Python package: pip install dms_check
- (Optional) Configure Google Cloud Secret Manager: If you choose to store the database password in Google Cloud Secret Manager, set the
GOOGLE_CLOUD_PROJECTenvironment variable to your Google Cloud project ID. Then, refer to the secret in your command-line argument (see Usage section).
Usage (either use tns or host)
ora_check --user <your_oracle_username> --password <your_password> --host <your_host> --port <your_port> --service <your_service_name> [--config <config_file_path>] [--format text|html]
Example ( using tns): If you are using Oracle Client and tns please ensure that LD_LIBRARY_PATH is updated with the oracle_client path. i.e:
export LD_LIBRARY_PATH=~/oracle-client/instantclient_23_5:$LD_LIBRARY_PATH
ora_check --user <your_oracle_username> --password <your_password> --tns <oracle_tns_alias> --tns_path <tnsnames.ora_path> [--config <config_file_path>] [--format text|html]
- Replace
<your_username>,<your_password>,<your_host>,<your_port>, and<your_service_name>with your Oracle database credentials and connection details. - You can use
gcp-secret:<secret_name>for the--passwordargument to retrieve the password from Google Secret Manager. - The
--formatargument specifies the output format (textorhtml). Defaults totext.
Example with Google Cloud Secret Manager:
export GOOGLE_CLOUD_PROJECT="your-gcp-project-id"
ora_check --user your_username --password gcp-secret:your-secret-name --host your_host --port 1521 --service your_service_name --format html
Example with custom YAML:
Optional - Configure the YAML file: If you want to customize checks create/update the config_oracle.yaml file (or specify a different path using the --config command-line argument) in the same directory as the script. This file should contain a list of database checks in YAML format. See the example below.
Example config_oracle.yaml:
owner_exclude_list: ['SYS', 'SYSTEM', 'CTXSYS', 'MDSYS', 'WMSYS', 'XDB', 'ORDDATA', 'AUDSYS', 'OJVMSYS', 'DBSFWUSER','DBSNMP', 'GSMADMIN_INTERNAL', 'DVSYS', 'OUTLN', 'APPQOSSYS', 'ORDSYS', 'LBACSYS']
validations:
- name: "Unsupported Columns"
description: "Columns with unsupported data types"
query: |
SELECT
OWNER,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE
FROM DBA_TAB_COLS
WHERE DATA_TYPE IN (
'ANYDATA', 'BFILE', 'INTERVAL DAY TO SECOND', 'INTERVAL YEAR TO MONTH',
'LONG', 'LONG RAW', 'SDO_GEOMETRY', 'UDT', 'UROWID', 'XMLTYPE'
)
AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Warning: The following columns have unsupported data types and will be replaced with NULL values:
- name: "Lob Data Types"
description: "Checks for LOB data types"
query: |
SELECT
OWNER,
TABLE_NAME,
COLUMN_NAME
FROM DBA_TAB_COLS
WHERE DATA_TYPE IN ('BLOB', 'CLOB', 'NCLOB') AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Warning: The following LOB columns are not replicated unless 'streamLargeObjects' is enabled:
- name: "Tables without Primary Keys"
description: "Tables missing primary keys"
query: |
SELECT
OWNER,
TABLE_NAME
FROM DBA_TABLES
WHERE TEMPORARY = 'N' AND OWNER NOT IN ({owner_exclude_list})
AND (OWNER, TABLE_NAME) NOT IN (
SELECT OWNER, TABLE_NAME FROM DBA_CONS_COLUMNS WHERE CONSTRAINT_NAME IN (
SELECT CONSTRAINT_NAME FROM DBA_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P'
)
)
warning_message: |
Warning: The following tables have no primary keys, so ROWID will be used for merging and migration operations:
- name: "Temporary Tables"
description: "Temporary tables are unsupported"
query: |
SELECT
OWNER,
TABLE_NAME
FROM DBA_TABLES
WHERE TEMPORARY = 'Y' AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Warning: Temporary tables are not supported and will not be replicated:
- name: "Logminer Limitations"
description: "Checks for long table or column names that exceed LogMiner limits"
query: |
SELECT
OWNER,
TABLE_NAME,
COLUMN_NAME
FROM DBA_TAB_COLUMNS
WHERE LENGTH(TABLE_NAME) > 30 OR LENGTH(COLUMN_NAME) > 30 AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Error: The following table or column names exceed LogMiner's 30-character limit and cannot be replicated:
- name: "LOBs greater than 100mb"
description: "Checks for lob column if they may exceed DMS limitation of 100mb"
query: |
SELECT
owner,
table_name,
column_name,
segment_name,
sum(chunk) / (1024 * 1024) AS total_lob_size_in_mb,
(sum(chunk) / (1024 * 1024))/COUNT(1) AS avg_lob_size_in_mb
FROM
dba_lobs
WHERE
segment_name IS NOT NULL
AND OWNER NOT IN ({owner_exclude_list})
GROUP BY owner, table_name, column_name, segment_name
HAVING (sum(chunk) / (1024 * 1024))/COUNT(1) > 100
warning_message: |
Warning: The following lob columns may exceed DMS's 100mb limit and cannot be replicated:
- name: "Unsupported Character Set"
description: "Checks for unsupported character sets"
query: |
SELECT
VALUE AS NLS_CHARACTERSET
FROM NLS_DATABASE_PARAMETERS
WHERE parameter='NLS_CHARACTERSET' and VALUE NOT IN ('AL16UTF16', 'AL32UTF8', 'IN8ISCII', 'JA16SJIS', 'US7ASCII', 'UTF8', 'WE8ISO8859P1', 'WE8ISO8859P9', 'WE8ISO8859P15', 'WE8MSWIN1252', 'ZHT16BIG5')
warning_message: |
Error: The database character set is not supported.
- name: "Unsupported Table Names"
description: "Checks for unsupported characters in table names"
query: |
SELECT
OWNER,
TABLE_NAME
FROM DBA_TABLES
WHERE REGEXP_LIKE(TABLE_NAME, '[^a-zA-Z0-9_]') AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Error: The following table names contain unsupported characters:
- name: "Unsupported Column Names"
description: "Checks for unsupported characters in column names"
query: |
SELECT
OWNER,
TABLE_NAME,
COLUMN_NAME
FROM DBA_TAB_COLUMNS
WHERE REGEXP_LIKE(COLUMN_NAME, '[^a-zA-Z0-9_]') AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Error: The following column names contain unsupported characters:
- name: "Too Many Tables"
description: "Checks if the number of tables exceeds the limit"
query: |
SELECT COUNT(*) TABLE_COUNT FROM DBA_TABLES WHERE OWNER NOT IN ({owner_exclude_list})
HAVING COUNT(*) > 10000
warning_message: |
Error: The number of tables exceeds the limit of 10,000.
- name: "Index-Organized Tables"
description: "Checks for Index-organized tables"
query: |
SELECT
OWNER,
TABLE_NAME
FROM DBA_TABLES
WHERE IOT_TYPE IS NOT NULL AND OWNER NOT IN ({owner_exclude_list})
warning_message: |
Error: Index-organized tables are not supported:
License
Metadata
Release files for dms_check 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| dms_check-0.1.4.tar.gz | 130.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dms_check-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 261.0 kB
Release files / dms_check-0.1.4.tar.gz
| Download URL | dms_check-0.1.4.tar.gz |
|---|---|
| Size | 130.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4c7d28a7632c6bcfdaaa2f550c697cfd6b2317c37711cb0ab194ee491c677a3f
|
|
BLAKE2b-256 checksum How to use checksums |
4cfdbd83fe432f6a76c1dd859a655f403835fdee5295713e58eebcb540b15fc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.3 CPython/3.12.6 Darwin/24.1.0
|
Release files / dms_check-0.1.4-py3-none-any.whl
| Download URL | dms_check-0.1.4-py3-none-any.whl |
|---|---|
| Size | 130.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d046e7f4b7995d1b77eda48a8618b182c4236b0c58e0dcd74bd841386bcc2a72
|
|
BLAKE2b-256 checksum How to use checksums |
3f4a4138bace533b8ef768917a9d3485e2292397202dbd47a38fb063dfcb7de9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.3 CPython/3.12.6 Darwin/24.1.0
|
Security for dms_check 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.