建立AWS DMS Fleet Advisor 的資料庫使用者 - AWS Database Migration Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立AWS DMS Fleet Advisor 的資料庫使用者

本節說明如何為來源資料庫建立使用者,使其具備 DMS 資料收集器所需的最低權限。

使用資料庫使用者搭配 AWS DMS Fleet Advisor

您可以使用 root 以外的資料庫使用者搭配 DMS 資料收集器。在將資料庫新增至詳細目錄之後,請在執行資料收集器之前,先指定使用者名稱和密碼。如需將資料庫新增至詳細目錄的詳細資訊,請參閱:管理受監控物件

使用完 DMS 資料收集器之後,您可以刪除您所建立的資料庫使用者。如需詳細資訊,請參閱 刪除資料庫使用者

重要

在下列範例中,請以您為資料庫建立的資料庫使用者名稱取代 {your_user_name}。然後,將 {your_password} 替換為一個安全的密碼。

使用 MySQL 建立資料庫使用者

若要在 MySQL 來源資料庫中建立資料庫使用者,請使用以下指令碼。請務必保留 GRANT 陳述式的其中一個版本,這取決於您的 MySQL 資料庫版本。

CREATE USER {your_user_name} identified BY '{your_password}'; GRANT PROCESS ON *.* TO {your_user_name}; GRANT REFERENCES ON *.* TO {your_user_name}; GRANT TRIGGER ON *.* TO {your_user_name}; GRANT EXECUTE ON *.* TO {your_user_name}; # For MySQL versions lower than 8.0, use the following statement. GRANT SELECT, CREATE TEMPORARY TABLES ON `temp`.* TO {your_user_name}; # For MySQL versions 8.0 and higher, use the following statement. GRANT SELECT, CREATE TEMPORARY TABLES ON `mysql`.* TO {your_user_name}; GRANT SELECT ON performance_schema.* TO {your_user_name}; SELECT IF(round(Value1 + Value2 / 100 + Value3 / 10000, 4) > 5.0129, 'GRANT EVENT ON *.* TO {your_user_name};', 'SELECT ''Events are not applicable'';') sql_statement INTO @stringStatement FROM ( SELECT substring_index(ver, '.', 1) value1, substring_index(substring_index(ver, '.', 2), '.', - 1) value2, substring_index(ver, '.', - 1) value3 FROM ( SELECT IF((@@version regexp '[^0-9\.]+') != 0, @@innodb_version, @@version) AS ver FROM dual ) vercase ) v; PREPARE sqlStatement FROM @stringStatement; SET @stringStatement := NULL; EXECUTE sqlStatement; DEALLOCATE PREPARE sqlStatement;

建立 Oracle 的資料庫使用者

若要在 Oracle 來源資料庫中建立資料庫使用者,請使用以下指令碼。

若要執行此 SQL 指令碼,請使用 SYSDBA 權限連線到 Oracle 資料庫。執行此 SQL 指令碼之後,請使用您以此指令碼建立的使用者憑證連線到資料庫。此外,請使用此使用者的憑證來執行 DMS 資料收集器。

下列指令碼會將 C## 字首新增至 Oracle 多租戶容器資料庫 (CDB) 的使用者名稱。

CREATE USER {your_user_name} IDENTIFIED BY "{your_password}"; GRANT CREATE SESSION TO {your_user_name}; GRANT SELECT ANY DICTIONARY TO {your_user_name}; GRANT SELECT ON DBA_WM_SYS_PRIVS TO {your_user_name}; BEGIN DBMS_NETWORK_ACL_ADMIN.CREATE_ACL( acl => UPPER('{your_user_name}') || '_Connect_Access.xml', description => 'Connect Network', principal => UPPER('{your_user_name}'), is_grant => TRUE, privilege => 'resolve', start_date => NULL, end_date => NULL); DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL( acl => UPPER('{your_user_name}') || '_Connect_Access.xml', host => '*', lower_port => NULL, upper_port => NULL); END;

建立 PostgreSQL 的資料庫使用者

若要在 PostgreSQL 來源資料庫中建立資料庫使用者,請使用以下指令碼。

CREATE USER "{your_user_name}" WITH LOGIN PASSWORD '{your_password}'; GRANT pg_read_all_settings TO "{your_user_name}"; -- For PostgreSQL versions 10 and higher, add the following statement. GRANT EXECUTE ON FUNCTION pg_ls_waldir() TO "{your_user_name}";

建立 Microsoft SQL 伺服器的資料庫使用者

若要在 Microsoft SQL Server 來源資料庫中建立資料庫使用者,請使用以下指令碼。

USE master GO IF NOT EXISTS (SELECT * FROM sys.sql_logins WHERE name = N'{your_user_name}') CREATE LOGIN [{your_user_name}] WITH PASSWORD=N'{your_password}', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO GRANT VIEW SERVER STATE TO [{your_user_name}] GRANT VIEW ANY DEFINITION TO [{your_user_name}] GRANT VIEW ANY DATABASE TO [{your_user_name}] IF LEFT(CONVERT(SYSNAME,SERVERPROPERTY('ProductVersion')), CHARINDEX('.', CONVERT(SYSNAME,SERVERPROPERTY('ProductVersion')), 0)-1) >= 12 EXECUTE('GRANT CONNECT ANY DATABASE TO [{your_user_name}]') DECLARE @dbname VARCHAR(100) DECLARE @statement NVARCHAR(max) DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM MASTER.sys.databases WHERE state = 0 AND is_read_only = 0 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @dbname WHILE @@FETCH_STATUS = 0 BEGIN SELECT @statement = 'USE '+ quotename(@dbname) +';'+ ' IF NOT EXISTS (SELECT * FROM sys.syslogins WHERE name = ''{your_user_name}'') OR NOT EXISTS (SELECT * FROM sys.sysusers WHERE name = ''{your_user_name}'') CREATE USER [{your_user_name}] FOR LOGIN [{your_user_name}]; EXECUTE sp_addrolemember N''db_datareader'', [{your_user_name}]' BEGIN TRY EXECUTE sp_executesql @statement END TRY BEGIN CATCH DECLARE @err NVARCHAR(255) SET @err = error_message() PRINT @dbname PRINT @err END CATCH FETCH NEXT FROM db_cursor INTO @dbname END CLOSE db_cursor DEALLOCATE db_cursor USE msdb GO GRANT EXECUTE ON dbo.agent_datetime TO [{your_user_name}]

刪除資料庫使用者

完成所有資料收集任務後,您可以刪除為 DMS 資料收集器建立的資料庫使用者。您可以使用下列指令碼,從資料庫刪除具有最低權限的使用者。

若要從 MySQL 資料庫中刪除該使用者,請執行下列指令碼。

DROP USER IF EXISTS "{your_user_name}";

若要從 Oracle 資料庫中刪除使用者,請執行下列指令碼。

DECLARE -- Input parameters, please set correct value cnst$user_name CONSTANT VARCHAR2(255) DEFAULT '{your_user_name}'; -- System variables, please, don't change var$is_exists INTEGER DEFAULT 0; BEGIN SELECT COUNT(hal.acl) INTO var$is_exists FROM dba_host_acls hal WHERE hal.acl LIKE '%' || UPPER(cnst$user_name) || '_Connect_Access.xml'; IF var$is_exists > 0 THEN DBMS_NETWORK_ACL_ADMIN.DROP_ACL( acl => UPPER(cnst$user_name) || '_Connect_Access.xml'); END IF; SELECT COUNT(usr.username) INTO var$is_exists FROM all_users usr WHERE usr.username = UPPER(cnst$user_name); IF var$is_exists > 0 THEN EXECUTE IMMEDIATE 'DROP USER ' || cnst$user_name || ' CASCADE'; END IF; END;

若要從 PostgreSQL 資料庫中刪除使用者,請執行下列指令碼。

DROP USER IF EXISTS "{your_user_name}";

若要從 SQL Server 資料庫中刪除使用者,請執行下列指令碼。

USE msdb GO REVOKE EXECUTE ON dbo.agent_datetime TO [{your_user_name}] USE master GO DECLARE @dbname VARCHAR(100) DECLARE @statement NVARCHAR(max) DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT name FROM MASTER.sys.databases WHERE state = 0 AND is_read_only = 0 OPEN db_cursor FETCH NEXT FROM db_cursor INTO @dbname WHILE @@FETCH_STATUS = 0 BEGIN SELECT @statement = 'USE '+ quotename(@dbname) +';'+ ' EXECUTE sp_droprolemember N''db_datareader'', [{your_user_name}] IF EXISTS (SELECT * FROM sys.syslogins WHERE name = ''{your_user_name}'') OR EXISTS (SELECT * FROM sys.sysusers WHERE name = ''{your_user_name}'') DROP USER [{your_user_name}];' BEGIN TRY EXECUTE sp_executesql @statement END TRY BEGIN CATCH DECLARE @err NVARCHAR(255) SET @err = error_message() PRINT @dbname PRINT @err END CATCH FETCH NEXT FROM db_cursor INTO @dbname END CLOSE db_cursor DEALLOCATE db_cursor GO IF EXISTS (SELECT * FROM sys.sql_logins WHERE name = N'{your_user_name}') DROP LOGIN [{your_user_name}] -- Use for SQL login GO