Mysql

將 mysql_native_password 複製到新伺服器

  • February 24, 2021

我對我的整個數據庫做了一個 mysqldump mysqldump --defaults-file="/home/ubuntu/.my.conf" -u api --all-databases > full-dump.sql。我設置了一個新的 mysql 和 phpmyadmin 並載入了 mysqldumpmysql -u root -p < full-dump.sql

然後我的root密碼停止工作(在兩台伺服器上都是一樣的)。我能夠重置密碼並重新獲得訪問權限。我現在將新伺服器上的 authentication_strings 與舊伺服器進行比較。當我重置密碼時,我注意到新伺服器上的字元串發生了變化。我的假設是新舊伺服器對相同的密碼使用不同的雜湊值,因此彼此不兼容。

有沒有辦法複製 mysql 使用者並使現有密碼有效?還是我總是必須像在這種情況下那樣手動重置它們?

每個版本的 MySQL 都為表提供特定數量的mysql.users

我再次提到了這一點April 12, 2012Cannot GRANTprivilege as root

您不能從一個主要版本 mysqldump mysql 模式並將其載入到不同的主要版本中。

您需要的是生成 SQL 來創建使用者

我為 MySQL 5.6 寫了一個版本,然後又回來了Mar 22, 2015導出所有 MySQL 使用者

我曾建議使用pt-show-grants。我還建議模仿它。

這是該文章的仿真程式碼

GRANT_CMDS=/tmp/ShowGrantsToExport.sql
GRANT_FILE=MyDatabaseUSers.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';')"
SQL="${SQL} FROM mysql.user WHERE user<>'' AND host<>''"
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${GRANT_CMDS}
mysql ${MYSQL_CONN} < ${GRANT_CMDS} | sed 's/$/;/g' > ${GRANT_FILE}

MySQL 5.7+ 怎麼樣?

pt-show-grants 不會生成 SQL 以使密碼可見。(PCI 審核員將爬牆尋找密碼洩露)

這是一個腳本,用於轉儲創建使用者命令及其密碼雜湊

GRANT_CMDS=/tmp/ShowGrantsToExport.sql
GRANT_FILE=MyDatabaseUSers.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET group_concat_max_len = 1024 * 1024 * 10;"
SQL="${SQL} SELECT CONCAT('CREATE USER IF NOT EXISTS ',QUOTE(user),'@',QUOTE(host),' IDENTIFIED WITH mysql_native_password AS ',QUOTE(authentication_string),';')"
SQL="${SQL} FROM mysql.user WHERE user<>'' AND host<>'';"
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${GRANT_FILE}
SQL="SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';')"
SQL="${SQL} FROM mysql.user WHERE user<>'' AND host<>''"
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${GRANT_CMDS}
mysql ${MYSQL_CONN} < ${GRANT_CMDS} | sed 's/$/;/g' >> ${GRANT_FILE}

如果您希望這適用於 MySQL 5.5 和 5.6,請將單詞更改authentication_stringpassword,並根據需要調整 CREATE USER 語法,可能是這樣的

GRANT_CMDS=/tmp/ShowGrantsToExport.sql
GRANT_FILE=MyDatabaseUSers.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET group_concat_max_len = 1024 * 1024 * 10;"
SQL="${SQL} SELECT CONCAT('CREATE USER ',QUOTE(user),'@',QUOTE(host),' IDENTIFIED AS ',QUOTE(password),';')"
SQL="${SQL} FROM mysql.user WHERE user<>'' AND host<>'';"
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${GRANT_FILE}
SQL="SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';')"
SQL="${SQL} FROM mysql.user WHERE user<>'' AND host<>''"
mysql ${MYSQL_CONN} -ANe"${SQL}" > ${GRANT_CMDS}
mysql ${MYSQL_CONN} < ${GRANT_CMDS} | sed 's/$/;/g' >> ${GRANT_FILE}

我沒有測試這些。所以,請測試它們,看看它是否為你生產。

接下來是什麼 ???

然後將 MyDatabaseUSers.sql 載入到新的 MySQL 實例中

--all-databases傾倒一切時請避免使用。您應該轉儲除mysql架構之外的所有內容(請參閱我的舊文章How do you mysqldump specific table(s)? on how to do that)

引用自:https://dba.stackexchange.com/questions/285942