Let's walk through on how to migrate sakila database from Azure for MySQL into Oracle Cloud MySQL
Database Service(MDS).
For the migration ,let's use MySQL Shell Utility features
1.
Dump Schema Utility
a.
This will help us to export the schema of Azure for MySQL Instance into Oracle Cloud Object Storage.
2.
Load Dump Utility
a.
This is help us to Import
the schema from Object
Storage to MySQL Database Service(MDS) at Oracle Cloud .
How does Migration Work ?
Suppose you wanted to do lift-shift of database called “Sakila” , so “Schema Dump” utility will export sakila database from sources(in this example ,source is AZURE Cloud) to OCI(oracle cloud
infrastructure) object storage.
Then “Load Dump” utility
will import directly to MySQL Database Service running in Oracle Cloud as which is managed service of MySQL.
Below diagram I have made for clear understanding…
What do we needed handy ?
1.
MySQL Shell 8.0.x Version .
2.
Azure for MySQL Up and Running.
3.
MySQL database service(MDS) Up and Running.
4.
Install OCI CLI on Azure VM Machine.
5.
Install OCI CLI on OCI(Oracle Cloud Compute
Instance)
6.
local_infile variables must be ON for destination machine.
How to Launch MySQL database service (MDS) ?
Below is my another blog will help us to create MDS instance:-
https://mysqlsolutionsarchitect.blogspot.com/
Additional Details
Azure VM details
|
Azure for MySQL Details
|
Oracle Cloud Compute Instance Details
|
MDS
Details
|
Public IP address:-
20.198.96.xx
SSH PPK file
User: azureuser
|
Database Name:- Sakila
End point IP:- azuremysql-dbs.mysql.database.azure.com
User:- admin123
Port: 3306
No of Tables: 23
|
Public IP Address: 140.238.227.xx
SSH ppk file
User:- opc
|
MDS Private IP
Address:- 10.0.0.xx
MySQL
Username:- admin
MySQL
Port: 3306
|
First Install OCI CLI in Azure compute instance
Command to Export the backup from Azure for MySQL to OCI
Object Storage
Open MySQL Shell and connect to Azure
compute instance(VM) then execute below commands
Connect azure for mysql Instance
mysqlsh -hazuremysql-dbs.mysql.database.azure.com
-uadmin123@azuremysql-dbs -pWelcome1!
[root@chandan-vm oltp_legacy]#
mysqlsh -hazuremysql-dbs.mysql.database.azure.com -uadmin123@azuremysql-dbs
-pWelcome1!
MySQL Shell 8.0.23
Copyright (c) 2016, 2021, Oracle
and/or its affiliates.
Oracle is a registered trademark of
Oracle Corporation and/or its affiliates.
Other names may be trademarks of
their respective owners.
Type '\help' or '\?' for help;
'\quit' to exit.
WARNING: Using a password on the
command line interface can be insecure.
Creating a session to
'admin123%40azuremysql-dbs@azuremysql-dbs.mysql.database.azure.com'
Fetching schema names for
autocompletion... Press ^C to stop.
Your MySQL connection id is 64630
Server version: 8.0.15 Source
distribution
No default schema selected; type \use
<schema> to set one.
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
|
Check for Compatibility issues and gather the problems in advance
before migration by using DRYRUN
|
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS > util.dumpSchemas(["sakila"],
"sakilaDBdump", {dryRun: true, ocimds: true})
|
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
util.dumpSchemas(["sakila"], "sakilaDBdump", {dryRun:
true, ocimds: true})
Acquiring global read
lock
Global read lock
acquired
Gathering information -
done
All transactions have
been started
Locking instance for
backup
NOTE: Backup lock is
not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may
fail with an error or not be completely consistent if schema changes are made
while dumping.
Global read lock has
been released
Checking for
compatibility with MySQL Database Service 8.0.23
NOTE: MySQL Server 5.7
detected, please consider upgrading to 8.0 first. You can check for potential
upgrade issues using util.checkForServerUpgrade().
ERROR: Procedure
sakila.film_not_in_stock - definition uses DEFINER clause set to user
`admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: Procedure
sakila.rewards_report - definition uses DEFINER clause set to user
`admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: Procedure
sakila.film_in_stock - definition uses DEFINER clause set to user
`admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: View
sakila.nicer_but_slower_film_list - definition uses DEFINER clause set to
user `admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: View
sakila.sales_by_film_category - definition uses DEFINER clause set to user
`admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: View
sakila.actor_info - definition uses DEFINER clause set to user `admin123`@`%`
which can only be executed by this user or a user with SET_USER_ID or SUPER
privileges (fix this with 'strip_definers' compatibility option)
ERROR: View
sakila.film_list - definition uses DEFINER clause set to user `admin123`@`%`
which can only be executed by this user or a user with SET_USER_ID or SUPER
privileges (fix this with 'strip_definers' compatibility option)
ERROR: View
sakila.sales_by_store - definition uses DEFINER clause set to user
`admin123`@`%` which can only be executed by this user or a user with
SET_USER_ID or SUPER privileges (fix this with 'strip_definers' compatibility
option)
ERROR: View
sakila.staff_list - definition uses DEFINER clause set to user `admin123`@`%`
which can only be executed by this user or a user with SET_USER_ID or SUPER
privileges (fix this with 'strip_definers' compatibility option)
ERROR: View
sakila.customer_list - definition uses DEFINER clause set to user `admin123`@`%`
which can only be executed by this user or a user with SET_USER_ID or SUPER
privileges (fix this with 'strip_definers' compatibility option)
Compatibility issues
with MySQL Database Service 8.0.23 were found. Please use the 'compatibility'
option to apply compatibility adaptations to the dumped DDL.
Util.dumpSchemas:
Compatibility issues were found (RuntimeError)
|
util.dumpSchemas(["sakila"],
"sakilaDBdump", {dryRun: true, ocimds: true, "compatibility": ["strip_definers",
"strip_restricted_grants"]})
|
FIX:-
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
util.dumpSchemas(["sakila"], "sakilaDBdump", {dryRun:
true, ocimds: true, "compatibility": ["strip_definers",
"strip_restricted_grants"]})
Acquiring global read
lock
Global read lock
acquired
Gathering information -
done
All transactions have
been started
Locking instance for
backup
NOTE: Backup lock is
not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may
fail with an error or not be completely consistent if schema changes are made
while dumping.
Global read lock has
been released
Checking for
compatibility with MySQL Database Service 8.0.23
NOTE: MySQL Server 5.7
detected, please consider upgrading to 8.0 first. You can check for potential
upgrade issues using util.checkForServerUpgrade().
Writing DDL for table
`sakila`.`inventory`
Writing DDL for table
`sakila`.`rental`
Writing DDL for table
`sakila`.`category`
Writing DDL for table
`sakila`.`address`
Writing DDL for table
`sakila`.`city`
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
|
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >util.dumpSchemas(["sakila"],"sakilaDBdump",{threads:30,"osBucketName":
"chandanBucket", "osNamespace":
"idazzjlcjqzj",
"ocimds": "true","ociConfigFile":"/root/.oci/config",
"compatibility": ["strip_definers",
"strip_restricted_grants"]})
|
Output
|
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
util.dumpSchemas(["sakila"],"sakilaDBdump",{threads:30,"osBucketName":
"chandanBucket", "osNamespace":
"idazzjlcjqzj",
"ocimds":
"true","ociConfigFile":"/root/.oci/config",
"compatibility": ["strip_definers",
"strip_restricted_grants"]})
Acquiring
global read lock
Global read
lock acquired
Gathering
information - done
All transactions
have been started
Locking
instance for backup
Data dump for
table `sakila`.`payment` will be written to 1 file
Data dump for
table `sakila`.`film_text` will be written to 1 file
Data dump for
table `sakila`.`film_actor` will be written to 1 file
Data dump for
table `sakila`.`rental` will be written to 1 file
Data dump for
table `sakila`.`inventory` will be written to 1 file
Data dump for
table `sakila`.`category` will be written to 1 file
Data dump for
table `sakila`.`address` will be written to 1 file
Data dump for
table `sakila`.`city` will be written to 1 file
1 thds dumping
- 100% (46.27K rows / ~46.27K rows), 1.61K rows/s, 96.26 KB/s uncompressed,
0.00 B/s compressed
Duration:
00:00:01s
Schemas
dumped: 1
Tables dumped:
16
Uncompressed
data size: 2.92 MB
Compressed
data size: 557.10 KB
Compression
ratio: 5.2
Rows written:
46273
Bytes written:
557.10 KB
Average
uncompressed throughput: 1.87 MB/s
Average
compressed throughput: 356.39 KB/s
MySQL
azuremysql-dbs.mysql.database.azure.com:3306 ssl JS >
|
You
may cross check whether DUMP has been exported to Oracle Cloud Object Storage
or not
|
Import Dump file into MySQL Database Service (MDS), from OCI Object Storage First is to install
OCI CLI by following below web links https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm For import into a MySQL DB Service (MDS), the MySQL Shell
instance where you run the dump loading utility must be installed on an Oracle Cloud Infrastructure Compute instance that
has access to the MySQL DB System.
Let’s connect Oracle Cloud Compute Instance ,a nd check
whether MDS Instance you are able to connect or not ?
How to connect Compute Instance- open Putty and Public IP
into it , see below screen shot.
How to Deploy MDS Instance ? Below is my another blog which
will help us to get through. https://mysqlsolutionsarchitect.blogspot.com/2020/09/how-to-launch-mysql-database-service.html Let’s Connect MDS instance ,
sudo su root
mysql -h10.0.1.3 -uadmin –pXXXXX
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
|
Connect MySQL Shell to Import
# mysqlsh -h10.0.1.3 -uadmin -pWelcome1!
DRY RUN scripts:-
MySQL 10.0.1.3:33060+ ssl JS >util.loadDump("sakilaDBdump",{dryRun:
true, osBucketName: "chandanBucket", osNamespace:
"idazzjlcjqzj","ociConfigFile":"/root/.oci/config"})
|
OUTPUT
MySQL
10.0.1.3:33060+ ssl JS >
util.loadDump("sakilaDBdump",{dryRun: true, osBucketName:
"chandanBucket", osNamespace: "idazzjlcjqzj","ociConfigFile":"/root/.oci/config"})
Loading DDL and Data from OCI ObjectStorage
bucket=chandanBucket, prefix='sakilaDBdump' using 4 threads.
Opening dump...
dryRun enabled, no changes will be made.
Target is MySQL 8.0.23-u2-cloud. Dump was produced
from MySQL 8.0.15
Fetching dump data from remote location...
Fetching 16 table metadata files for schema
`sakila`...
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL script for schema `sakila`
[Worker001] Executing DDL script for `sakila`.`city`
[Worker003] Executing DDL script for
`sakila`.`category`
[Worker002] Executing DDL script for
`sakila`.`sales_by_store` (placeholder for view)
[Worker003] Executing DDL script for `sakila`.`staff_list`
(placeholder for view)
[Worker000] Executing DDL script for
`sakila`.`actor_info` (placeholder for view)
Executing common postamble SQL
No data loaded.
0 warnings were reported during the load.
MySQL 10.0.1.3:33060+ ssl JS >
|
Script to Import DUMP file from Object Storage to MySQL Database System
|
util.loadDump("sakilaDBdump",{osBucketName:
"chandanBucket", osNamespace:
"idazzjlcjqzj","ociConfigFile":"/root/.oci/config"})
|
OUTPUT
MySQL 10.0.1.3:33060+ ssl JS > util.loadDump("sakilaDBdump",{osBucketName:
"chandanBucket", osNamespace:
"idazzjlcjqzj","ociConfigFile":"/root/.oci/config"})
Loading
DDL and Data from OCI ObjectStorage bucket=chandanBucket,
prefix='sakilaDBdump' using 4 threads.
Opening
dump...
Target
is MySQL 8.0.23-u2-cloud. Dump was produced from MySQL 8.0.15
Fetching
dump data from remote location...
Fetching
16 table metadata files for schema `sakila`...
[Worker000]
sakila@payment@@0.tsv.zst: Records: 16049
Deleted: 0 Skipped: 0 Warnings: 0
Executing
common postamble SQL
15
chunks (46.27K rows, 2.92 MB) for 15 tables in 1 schemas were loaded in 2 sec
(avg throughput 1.46 MB/s)
0
warnings were reported during the load.
MySQL
10.0.1.3:33060+ ssl JS >
|
Finally Import Has been done
successfully. Let’s verify The results
MySQL 10.0.1.3:33060+ ssl JS > \sql
Switching to SQL mode... Commands end with ;
MySQL 10.0.1.3:33060+ ssl SQL > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
+--------------------+
5 rows in set (0.0020 sec)
MySQL 10.0.1.3:33060+ ssl SQL > use sakila;
Default schema set to `sakila`.
Fetching table and column names from `sakila` for auto-completion...
Press ^C to stop.
MySQL 10.0.1.3:33060+ ssl sakila
SQL > select count(*) from city;
+----------+
| count(*) |
+----------+
| 600 |
+----------+
1 row in set (0.0025 sec)
MySQL 10.0.1.3:33060+ ssl sakila
SQL > show tables;
+----------------------------+
| Tables_in_sakila |
+----------------------------+
| actor |
| actor_info |
| address |
| category |
| city |
| country |
| customer |
| customer_list |
| film |
| film_actor |
| film_category |
| film_list |
| film_text |
| inventory |
| language |
| nicer_but_slower_film_list |
| payment |
| rental |
| sales_by_film_category |
| sales_by_store |
| staff |
| staff_list |
| store |
+----------------------------+
23 rows in set (0.0019 sec)
MySQL 10.0.1.3:33060+ ssl sakila
SQL >
|
Conclusion:-
Migration happened successfully!!! MySQL Shell utility makes MySQL easier to use, by providing
an interactive MySQL client supporting SQL, Document Store, JavaScript &
Python interface with support for writing custom extensions.
MySQL Database Service is a fully managed database service
that enables organizations to deploy cloud-native applications using the
world's most popular open source database. It is 100% developed, managed and
supported by the MySQL Team.
|
|