Google Cloud Database Migration Assessment for Microsoft SQL Server
Instructions on how to prepare and run Google Database Migration Assessment Data Extractor for Microsoft SQL Server to extract the data required for analysis by the Database Migration Assessment tool.
These scripts have been tested with the following platforms:
SQL Server Versions:
- SQL Server 2008 (SP4-GDR) (KB5020863) - 10.0.6814.4 (X64) through SQL Server 2022
- AZURE SQL Database
Operating System Versions:
- Windows Server 2012 through Windows Server 2022 (Requires PowerShell Version 5 or Greater)
Introduction
This utility extracts metadata about the tables, partitions and SQL workload in a database into CSV files. It also leverages perfmon data that must have a perfmon counter started before the final data collection. These CSV files are then used by Database Migration Assessment internally to analyze the data with Google Database Migration Assessment.
License Requirements
!!! IMPORTANT Google Database Migration Assessment does not require any additional licensing with regards to Microsoft SQL Server.
Database Privileges
This utility must be run as a database user with privileges to SELECT from certain data dictionary views. The scripts "createUserForAssessmentWithSQLAuth.bat" and "createUserForAssessmentWithWindowsAuth.bat" are supplied to create the required user and privileges. Instructions for executing it are below. Alternatively, you may use a user that already has following privileges:
In the master database:
GRANT VIEW SERVER STATE TO [username];
GRANT SELECT ALL USER SECURABLES TO [username];
GRANT VIEW ANY DATABASE TO [username];
GRANT VIEW ANY DEFINITION TO [username];
GRANT VIEW SERVER STATE TO [username];
GRANT VIEW DATABASE STATE TO [username];
In addition the user must also be mapped to all user databases, tempdb and master databases along with the following grant:
use [user database name];
CREATE USER [username] FOR LOGIN [username];
GRANT VIEW DATABASE STATE TO [username];
System Requirements
The collection script depends on the following executables to be available on the machine from which it is run. The script is also expected to be run from a Windows machine in "Administrator Mode":
command prompt
powershell (version 5 or greater)
sqlcmd (version 11.0.7512.11 or greater)
If needed sqlcmd can be downloaded from here
Note
Ensure that the ODBC
version of sqlcmd
is used Ensure that sqlcmd
is also in your $PATH
variable
Preparation
In order to begin running the Database Migration Assessment Collection process, download the collector script from here onto the host to be collected and follow the below instructions:
- Alternative download instructions:
mkdir ./dbma_collector && cd dbma_collector
wget https://github.com/GoogleCloudPlatform/database-assessment/releases/latest/download/db-migration-assessment-collection-scripts-sqlserver.zip
- Unzip the install archive:
unzip db-migration-assessment-collection-scripts-sqlserver.zip
- An existing user may be used or one can be created using the scripts as shown below. SYSADMIN is not required although a user with that privilege may be used:
If an existing user with SYSADMIN privileges wil not be used, from a command prompt, execute either of the following scripts depending on what type of authentication you currently use for your SYSADMIN user.
In this example the collection user will use SQL Authentication:
- createUserForAssessmentWithSQLAuth.bat
The following parameters can be specified:
-serverName ** Required
-port ** Optional (Defaults to 1433)
-serverUserName ** Required
-serverUserPass ** Required
-collectionUserName ** Required
-collectionUserPass ** Optional (If not provided will be prompted)
For a Named Instance:
createUserForAssessmentWithSQLAuth.bat -serverName [servername\instanceName] -port [port number] -serverUserName [existing privileged user] -serverUserPass [privileged user password] -collectionUserName [collection user name] -collectionUserPass [collection user password]
For a Default Instance:
createUserForAssessmentWithSQLAuth.bat -serverName [servername] -port [port number] -collectionUserName [collection user name] -collectionUserPass [collection user password]
In this example, the created user will use Windows Authentication:
- createUserForAssessmentWithWindowsAuth.bat
The following parameters can be specified:
-serverName ** Required
-port ** Optional (Defaults to 1433)
-collectionUserName ** Required
-collectionUserPass ** Optional (If not provided will be prompted)
For a Named Instance:
createUserForAssessmentWithWindowsAuth.bat -serverName [servername\instanceName] -port [port number] -collectionUserName [collection user name] -collectionUserPass [collection user password]
For a Default Instance:
createUserForAssessmentWithWindowsAuth.bat -serverName [servername] -port [port number] -collectionUserName [collection user name] -collectionUserPass [collection user password]
Execution
Perfmon Requirements (Optional)
- NOTE: Executing Perfmon is OPTIONAL. If not executed the tool will evaluate complexity of migration, but not rightsizing requirements.
-
NOTE: The standard perfmon collector collects every 10 minutes for 8 days.
-
If you have your own perfmon counters capturing the following statistics or run on a SQL Server Product such as Amazon RDS or Google CloudSQL for SQL Server, skip to step b, otherwise proceed to step a. ** The Perfmon data collection process is optional and can be safely skipped. However, there will be no right sizing information in the assessment report.
\Memory\Available MBytes total amount of available memory on the system \PhysicalDisk(_Total)\Avg. Disk Bytes/Read shows the average size of read operations on a volume in bytes \PhysicalDisk(_Total)\Avg. Disk Bytes/Write shows the average size of write operations on a volume in bytes \PhysicalDisk(_Total)\Avg. Disk sec/Read displays the average time in seconds it takes to read data from a disk \PhysicalDisk(_Total)\Avg. Disk sec/Write displays the average time in seconds it takes to write data to a disk \PhysicalDisk(_Total)\Disk Reads/sec displays the read IOPS from a file per second (if file is in file cache this counter is not incremented) \PhysicalDisk(_Total)\Disk Writes/sec displays the write IOPS to a file per second (if file is in file cache this counter is not incremented) \Processor(_Total)\% Idle Time the percentage of time a processor spends on idle threads \Processor(_Total)\% Processor Time displays the percentage of time a processor spends executing non-idle threads \Processor Information(_Total)\Processor Frequency processor frequency \System\Processor Queue Length number of threads that are ready to execute but waiting for a core to become available \SQLServer:Buffer Manager\Buffer cache hit ratio this ratio is a measure of the percentage of pages that were found in memory (SQL buffer pool) without having to be read from disk. \SQLServer:Buffer Manager\Checkpoint pages/sec the number of dirty pages that are moved from the SQL buffer pool to disk during a checkpoint. \SQLServer:Buffer Manager\Free list stalls/sec how many requests per second are waiting for a free page (values above 2 means server needs more memory) \SQLServer:Buffer Manager\Page life expectancy indicates the memory pressure in allocated memory to the SQL Server instance \SQLServer:Buffer Manager\Page lookups/sec number of requests to find a page in the buffer pool \SQLServer:Buffer Manager\Page reads/sec rate at which the disk is read to resolve page faults (pages read into memory) \SQLServer:Buffer Manager\Page writes/sec rate at which page data is written to the disk to open up space in physical memory \SQLServer:General Statistics\User Connections number of current connections to SQL Server. \SQLServer:Memory Manager\Memory Grants Pending total number of SQL Server processes that are waiting for workspace memory to be granted (Should nearly always be zero) \SQLServer:Memory Manager\Target Server Memory (KB) the amount of memory that SQL Server can potentially consume \SQLServer:Memory Manager\Total Server Memory (KB) the amount of memory the server has committed using the memory manager \SQLServer:SQL Statistics\Batch Requests/sec number of T-SQL commands that are being received by the server per second \NUMA Node Memory(_Total)\Total MBytes represents the total amount of physical memory associated with a NUMA node in megabytes \NUMA Node Memory(_Total)\Available MBytes represents the free amount of physical memory associated with a NUMA node in megabytes \Process(_Total)\IO Read Operations/sec shows the rate at which a process issues read I/O operations. This counter includes all I/O activity generated by the process, including file, network, and device I/O's \Process(_Total)\IO Write Operations/sec shows the rate at which a process issues write I/O operations. This counter includes all I/O activity generated by the process, including file, network, and device I/O's \Process(_Total)\IO Read Bytes/sec shows the rate at which a process reads bytes in I/O operations. This counter includes all I/O activity generated by the process, such as file, network, and device I/O. \Process(_Total)\IO Write Bytes/sec shows the rate at which a process writes bytes in I/O operations. This counter includes all I/O activity generated by the process, such as file, network, and device I/O.
-
From a command prompt session in "Administrator Mode" on the server you would like to collect data on, execute the following command:
-
manageSQLServerPerfmonDataset.bat The following parameters can be specified:
- -operation ** Required (create, start, stop, delete, collect, createemptyfile, help)
- -instanceType ** Required (default, named)
- -namedInstanceName ** Required if instanceType is "named" (should be the instance name without the server name)
- -sampleDuration ** The number of intervals that perfmon sample will run defaults to 1152 (10 minute samples for 8 days)
- -sampleInterval ** The interval that perfmon sample will run defaults to 600 (every 10 minutes)
To create and start the perfmon collection:
For a default instance:
manageSQLServerPerfmonDataset.bat -operation create -instanceType default -sampleDuration [number of intervals to sample] -sampleInterval [frequency of sample intervals in seconds]
For a named instance:
manageSQLServerPerfmonDataset.bat -operation create -instanceType named -namedInstanceName [instance name] -sampleDuration [number of intervals to sample] -sampleInterval [frequency of sample intervals in seconds]
The script will create a permon data set that will collect the above metrics at a 10 minute intervals for 8 days. The dataset will automatically stop after 8 days of collection. To get the most accurate statistics, it would be good to have this collection run over the busiest time for the server.
Perform Collection
- When the perfmon dataset completes or if you would like to execute the collection sooner, execute the following command from a command prompt session in "Administrator Mode" on the server you would like to collect data on and return the subsequent .zip file to Google.
-
The collection can also be run for all user databases or a single user database. See the below examples for each scenario
-
runAssessment.bat The following parameters can be specified:
- -serverName **Required
- -port **Optional (Defaults to 1433)
- -database **Optional (Defaults to all user databases)
- -collectionUserName **Required
- -collectionUserPass **Required
- -ignorePerfmon **Optional (Defaults to "false" / Set to "true" to ignore perfmon collection)
- -manualUniqueId **Optional (Defaults to "NA" - Gives the ability the user to tag their collection with a unique name)
- -collectVMSpecs **Optional switch. See below.
- -outputDirectory **Optional (write the final zip file to another location - must be escaped properly if spaces are in the directory name)
To Execute the Collection:
For a default instance (all databases):
runAssessment.bat -serverName [servername] -port [port number] -collectionUserName [collection user name] -collectionUserPass [collection user password] -manualUniqueId [string]
Example (default port): runAssessment.bat -serverName MS-SERVER1 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
Example (custom port): runAssessment.bat -serverName MS-SERVER1 -port 1435 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
For a default instance (single database):
runAssessment.bat -serverName [servername] -port [port number] -database [single database name] -collectionUserName [collection user name] -collectionUserPass [collection user password] -manualUniqueId [string]
Example (default port): runAssessment.bat -serverName MS-SERVER1 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
Example (custom port): runAssessment.bat -serverName MS-SERVER1 -port 1435 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
For a named instance (all databases):
runAssessment.bat -serverName [servername\instanceName] -port [port number] -collectionUserName [collection user name] -collectionUserPass [collection user password] -manualUniqueId [string]
Example (default port): runAssessment.bat -serverName MS-SERVER1/SQL2019 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
Example (custom port): runAssessment.bat -serverName MS-SERVER1 -port 1435 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
For a named instance (single database):
runAssessment.bat -serverName [servername\instanceName] -port [port number] -database [single database name] -collectionUserName [collection user name] -collectionUserPass [collection user password] -manualUniqueId [string]
Example (default port): runAssessment.bat -serverName MS-SERVER1/SQL2019 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
Example (custom port): runAssessment.bat -serverName MS-SERVER1 -port 1437 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string]
For Azure SQL Database (Ignore Perfmon Collection):
runAssessment.bat -serverName [servername] -port [port number] -database [database name] -collectionUserName [collection user name] -collectionUserPass [collection user password] -ignorePerfmon true -manualUniqueId [string]
Example (default port): runAssessment.bat -serverName MS-SERVER1 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -ignorePerfmon true -manualUniqueId [string]
Example (custom port): runAssessment.bat -serverName MS-SERVER1 -port 1435 -database AdventureWorks2019 -collectionUserName sa -collectionUserPass password123 -ignorePerfmon true -manualUniqueId [string]
Example (default port / all databases): runAssessment.bat -serverName MS-SERVER1 -collectionUserName sa -collectionUserPass password123 -ignorePerfmon true -manualUniqueId [string]
Example (custom port / all databases): runAssessment.bat -serverName MS-SERVER1 -port 1435 -collectionUserName sa -collectionUserPass password123 -ignorePerfmon true -manualUniqueId [string]
Notes:
1. Google Database Migration Assessment Data Extractor extracts data for all user databases present in the instance
2. Collection scripts should be executed from an "Administrator Mode" command prompt
3. When using a port to connect only provide the local host name
4. The manualUniqueId can be used to give the collection a unique identifier specified by the customer
CollectVMSpecs:
To provide rightsizing information the script attempts to connect to the host VM using the current users credentials and collect hardware specs (number of CPUs/amount of memory).
If the current user does not have sufficient permissions, it will skip this step. To manually input the correct credentials instead when this occurs, specify the -collectVMSpecs
switch.
This is recommended if you plan to upload the results to the Migration Center.
Example: runAssessment.bat -serverName MS-SERVER1 -collectionUserName sa -collectionUserPass password123 -manualUniqueId [string] -collectVMSpecs
Return Results
- An archive of the extracted results will be created in the directory collector/output.
- The full path and file name will be displayed on completion.
- Return the listed file to Google for processing
!!! IMPORTANT Do not modify the name or the contents of the zip file without consultation from Google.
License
Copyright 2024 Google LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.