MySQL Shell 8.4  /  MySQL AdminAPI  /  為 AdminAPI 建立使用者帳戶

6.4 為 AdminAPI 建立使用者帳戶

用於在 InnoDB 叢集、InnoDB 叢集集或 InnoDB ReplicaSet 部署中設定和管理成員伺服器實例的使用者帳戶,除了完整的 MySQL 管理員權限(SUPERGRANT OPTIONCREATEDROP 等)之外,還必須具有中繼資料表格的完整讀取和寫入權限。如需更多資訊,請參閱 MySQL 提供的權限

您可以為此目的在伺服器上使用 root 帳戶,但如果您這樣做,部署中每個成員伺服器上的 root 帳戶都必須具有相同的密碼。基於安全考量,不建議使用 root 帳戶。

相反地,建議的方法是使用 AdminAPI 的 JavaScript dba.configureInstance()cluster.setupAdminAccount() 操作來設定使用者帳戶。這些操作接受的使用者名稱格式遵循標準 MySQL 帳戶名稱格式,請參閱 指定帳戶名稱

如果您偏好設定使用者帳戶,所需的權限會列在 手動設定 InnoDB 叢集管理員帳戶。如果只需要讀取操作,例如用於監控目的,您可以使用具有更多限制權限的帳戶,如本主題所述。

重要

用於設定或管理 InnoDB 叢集、InnoDB 叢集集或 InnoDB ReplicaSet 部署的每個帳戶,在部署中的所有成員伺服器實例上都必須存在,且具有相同的使用者名稱和相同的密碼。

伺服器設定帳戶

在要加入 InnoDB 叢集、InnoDB 叢集集或 InnoDB ReplicaSet 部署的每個伺服器實例上,都需要伺服器設定帳戶。您可以使用 dba.configureInstance() JavaScript 命令或 dba.configure_instance() Python 命令搭配 clusterAdmin 選項來設定此帳戶。

為了提高安全性,請在互動式提示中指定密碼,否則請使用 clusterAdminPassword 選項指定密碼。在部署中的每個伺服器實例上,以相同方式建立相同的帳戶,具有相同的使用者名稱和密碼,包括您連線以建立部署的實例,以及之後加入的實例。

您可以使用 clusterAdminPasswordExpiration 選項來定義密碼到期日。此選項可以設定為天數、NEVER 表示永不到期,或 DEFAULT 表示使用系統預設值。

如果您使用 SSL 憑證進行驗證,您可以使用 clusterAdminCertIssuerclusterAdminCertSubject 選項分別新增憑證簽發者和主體。

您使用 dba.configureInstance() 操作建立的伺服器設定帳戶,不會 複寫到 InnoDB 叢集、InnoDB 叢集集或 InnoDB ReplicaSet 部署中的其他伺服器。MySQL Shell 會停用 dba.configureInstance() 操作的二進位記錄。因此,您必須在每個伺服器實例上單獨建立帳戶。

clusterAdmin 選項必須搭配基於具有建立具有適當權限的使用者權限的使用者的 MySQL Shell 連線使用。在此 JavaScript 範例中,使用 root 使用者

mysql-js> dba.configureInstance('root@ic-1:3306', {clusterAdmin: "'icadmin'@'ic-1%'"});

同樣地,在此 Python 範例中,使用 root 使用者

mysql-py> dba.configure_instance('root@ic-1:3306', clusterAdmin="'icadmin'@'ic-1%'");

管理員帳戶

完成設定程序後,可以使用管理員帳戶來管理部署。您可以設定多個管理員帳戶。若要建立管理員帳戶,請在將所有實例新增至 InnoDB 叢集或 InnoDB ReplicaSet 後,發出 cluster.setupAdminAccount() JavaScript 命令。或發出 Python 命令:<Cluster>setup_admin_account()

此命令會使用您指定的使用者名稱和密碼建立帳戶,並具有所有必要的權限。使用 cluster.setupAdminAccount() 建立帳戶的交易會寫入二進位記錄,並傳送至叢集中的所有其他伺服器實例,以便在它們上建立帳戶。

若要使用 setupAdminAccount() 操作,您必須以具有建立使用者權限的 MySQL 使用者身分連線,例如以 root 身分連線。setupAdminAccount(user) 操作也讓您能夠在使用 dba.upgradeMetadata() JavaScript 操作或 dba.upgrade_metadata() Python 操作之前,將現有的 MySQL 帳戶升級為必要的權限。

強制性的 user 引數是您想要建立以管理部署的 MySQL 帳戶名稱。setupAdminAccount() 操作接受的使用者名稱格式遵循標準 MySQL 帳戶名稱格式。如需更多資訊,請參閱 指定帳戶名稱。使用者引數格式為 username[@host],其中 host 是選用的,如果未提供,則預設為 % 通配符。

例如,若要使用 JavaScript 建立名為 icadmin 的使用者來管理指派給變數 myCluster 的 InnoDB 叢集,請發出

mysql-js> myCluster.setupAdminAccount('icadmin')

Missing the password for new account icadmin@%. Please provide one.
Password for new account: ********
Confirm password: ********

Creating user icadmin@%.
Setting user password.
Account icadmin@% was successfully created.

或使用 Python

mysql-py> myCluster.setup_admin_account('icadmin')

Missing the password for new account icadmin@%. Please provide one.
Password for new account: ********
Confirm password: ********

Creating user icadmin@%.
Setting user password.
Account icadmin@% was successfully created.

setupAdminAccount() 具有下列 SSL 特定選項

  • requireCertIssuer:帳戶的選用 SSL 憑證簽發者。

  • requireCertSubject:帳戶的選用 SSL 憑證主體。

  • passwordExpiration: numberOfDays | Never | Default:帳戶的密碼到期設定。

注意

如果設定了 requireCertIssuerrequireCertSubject 其中一個或兩個,則現有密碼會變成選用。

更新舊帳戶

如果您擁有以 MySQL Shell 8.0.20 之前版本建立的伺服器設定帳戶或管理員帳戶,請使用 setupAdminAccount() 操作的 update 選項來升級現有使用者的權限。這在升級期間很重要,以確保使用者帳戶是相容的。例如,若要使用 JavaScript 升級名為 icadmin 的使用者,請發出

mysql-js> myCluster.setupAdminAccount('icadmin', {'update':1})
Updating user icadmin@%.
Account icadmin@% was successfully updated.

或使用 Python

mysql-py> myCluster.setup_admin_account('icadmin',update=1})
Updating user icadmin@%.
Account icadmin@% was successfully updated.

這是 cluster.setupAdminAccount() 命令的特殊用法,不會寫入二進位記錄。