將 mysql_native_password 複製到新伺服器
我對我的整個數據庫做了一個 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, 2012
:Cannot 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_string
為password
,並根據需要調整 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)