使用Shell腳本批量執(zhí)行SQL腳本
腳本示例
#!/bin/bash
# 配置數(shù)據(jù)庫(kù)和用戶(hù)信息
DATABASES=("Database1" "Database2" "Database3" "Database4" "Database5")
USERS=("user1" "user2" "user3" "user4" "user5" "user6")
PASSWORD="your_password" # 假設(shè)所有用戶(hù)使用同一個(gè)密碼
SQL_SCRIPT="upgrade_script.sql" # SQL 腳本路徑
# 數(shù)據(jù)庫(kù)執(zhí)行函數(shù)
execute_sql() {
local db=$1
local user=$2
local sql=$3
echo "Executing script on database: $db, user: $user..."
mysql -h localhost -u "$user" -p"$PASSWORD" "$db" < "$sql"
if [[ $? -ne 0 ]]; then
echo "Error: Execution failed on $db for user $user" >&2
return 1
fi
echo "Success: Executed script on $db for user $user"
}
# 主循環(huán):對(duì)每個(gè)數(shù)據(jù)庫(kù)和用戶(hù)執(zhí)行 SQL
for db in "${DATABASES[@]}"; do
for user in "${USERS[@]}"; do
execute_sql "$db" "$user" "$SQL_SCRIPT"
done
done
echo "All scripts executed successfully!"
工作流程
1.配置部分:
- DATABASES 列出所有目標(biāo)數(shù)據(jù)庫(kù)。
- USERS 列出所有需要執(zhí)行 SQL 腳本的用戶(hù)。
- PASSWORD 是用戶(hù)的統(tǒng)一密碼,腳本使用 -p 參數(shù)傳遞密碼。
- SQL_SCRIPT 是 SQL 腳本的文件路徑。
2.函數(shù)定義:
- execute_sql 函數(shù)通過(guò) mysql 命令連接數(shù)據(jù)庫(kù)并執(zhí)行腳本。
- 檢查命令返回值 $?,如有錯(cuò)誤會(huì)輸出失敗信息到標(biāo)準(zhǔn)錯(cuò)誤。
3.主循環(huán):
- 外層循環(huán)遍歷每個(gè)數(shù)據(jù)庫(kù)。
- 內(nèi)層循環(huán)遍歷每個(gè)用戶(hù)。
- 對(duì)每個(gè) 數(shù)據(jù)庫(kù)-用戶(hù) 執(zhí)行 execute_sql 函數(shù)。
4.日志記錄:
- 在執(zhí)行腳本時(shí)打印執(zhí)行進(jìn)度。
- 成功和失敗的信息分別輸出到標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。
注意事項(xiàng)
SQL 腳本的冪等性:
- 確保 SQL 腳本是冪等的(多次執(zhí)行不會(huì)產(chǎn)生重復(fù)影響)。
- 如果需要,可以在 SQL 腳本中添加 IF NOT EXISTS 等判斷條件。
數(shù)據(jù)庫(kù)和用戶(hù)權(quán)限:
確保所有用戶(hù)對(duì)目標(biāo)數(shù)據(jù)庫(kù)有執(zhí)行權(quán)限,否則會(huì)出現(xiàn)權(quán)限錯(cuò)誤。
MySQL 密碼管理:
腳本中密碼明文存儲(chǔ)可能存在安全風(fēng)險(xiǎn),可以改用 .my.cnf 文件來(lái)管理憑據(jù):
[client] user=user1 password=your_password
然后調(diào)用時(shí)簡(jiǎn)化為:
mysql Database1 < upgrade_script.sql
腳本執(zhí)行路徑:
確保腳本執(zhí)行時(shí),SQL_SCRIPT 文件路徑正確。如果腳本運(yùn)行在不同目錄,建議使用絕對(duì)路徑。
執(zhí)行錯(cuò)誤處理:
如果一個(gè)數(shù)據(jù)庫(kù)或用戶(hù)執(zhí)行失敗,建議腳本繼續(xù)運(yùn)行,記錄失敗的數(shù)據(jù)庫(kù)和用戶(hù),以便后續(xù)重試。
多線程優(yōu)化(可選):
如果數(shù)據(jù)庫(kù)和服務(wù)器性能允許,可以使用 & 并發(fā)執(zhí)行以提高效率:
for db in "${DATABASES[@]}"; do
for user in "${USERS[@]}"; do
execute_sql "$db" "$user" "$SQL_SCRIPT" &
done
done
wait
可能遇到的問(wèn)題
1.腳本執(zhí)行失?。?/p>
原因:腳本內(nèi)容不正確、數(shù)據(jù)庫(kù)用戶(hù)無(wú)權(quán)限、網(wǎng)絡(luò)問(wèn)題等。
解決:查看失敗日志,修正 SQL 腳本或用戶(hù)權(quán)限。
2.MySQL 執(zhí)行超時(shí):
如果腳本非常大或查詢(xún)耗時(shí)長(zhǎng),可能會(huì)出現(xiàn)超時(shí)問(wèn)題。
解決:在 MySQL 中調(diào)整 max_allowed_packet 和 wait_timeout 參數(shù)。
3.密碼泄露風(fēng)險(xiǎn):
密碼明文存儲(chǔ)在腳本中存在安全隱患。
建議改用 .my.cnf 或環(huán)境變量存儲(chǔ)密碼。
4.并發(fā)執(zhí)行的沖突:
并發(fā)運(yùn)行可能導(dǎo)致鎖表或資源競(jìng)爭(zhēng)。
解決:控制并發(fā)數(shù)量,或按順序逐一執(zhí)行。
為所有用戶(hù)授予數(shù)據(jù)庫(kù)執(zhí)行權(quán)限的操作指南
步驟 1:明確權(quán)限需求
確認(rèn)需要授予的權(quán)限類(lèi)型。對(duì)于執(zhí)行 SQL 腳本的需求,通常需要 EXECUTE 或其他相關(guān)權(quán)限(如 SELECT, UPDATE, INSERT, DELETE)。
確認(rèn)哪些用戶(hù)需要權(quán)限。
步驟 2:SQL 語(yǔ)法示例
假設(shè)目標(biāo)數(shù)據(jù)庫(kù)名為 target_db,需要為 5 個(gè)數(shù)據(jù)庫(kù)中的每個(gè)數(shù)據(jù)庫(kù)的 6 個(gè)用戶(hù)授予權(quán)限,以下是通用的 GRANT 語(yǔ)法:
USE target_db; -- 示例:為用戶(hù) user1 授予 EXECUTE 權(quán)限 GRANT EXECUTE ON DATABASE target_db TO user1; -- 示例:如果還需要 SELECT、INSERT 權(quán)限: GRANT SELECT, INSERT, UPDATE, DELETE ON DATABASE target_db TO user1;
步驟 3:為所有用戶(hù)批量授予權(quán)限
假設(shè)有多個(gè)用戶(hù)和多個(gè)數(shù)據(jù)庫(kù),可以用腳本循環(huán)處理,以下是手動(dòng) SQL 示例:
-- 在目標(biāo)數(shù)據(jù)庫(kù)下為每個(gè)用戶(hù)循環(huán)授予權(quán)限 USE target_db; GRANT EXECUTE ON DATABASE target_db TO user1; GRANT EXECUTE ON DATABASE target_db TO user2; GRANT EXECUTE ON DATABASE target_db TO user3; GRANT EXECUTE ON DATABASE target_db TO user4; GRANT EXECUTE ON DATABASE target_db TO user5; GRANT EXECUTE ON DATABASE target_db TO user6;
步驟 4:使用 Shell 腳本批量執(zhí)行 GRANT
腳本內(nèi)容
假設(shè)我們使用 mysql 客戶(hù)端登錄來(lái)批量執(zhí)行這些 SQL 授權(quán)操作:
#!/bin/bash
# 數(shù)據(jù)庫(kù)配置
HOST="localhost"
USER="root"
PASSWORD="your_password"
# 數(shù)據(jù)庫(kù)和用戶(hù)列表
DATABASES=("db1" "db2" "db3" "db4" "db5")
USERS=("user1" "user2" "user3" "user4" "user5" "user6")
# 授權(quán)腳本
for DB in "${DATABASES[@]}"; do
for USER in "${USERS[@]}"; do
echo "Granting EXECUTE privilege on $DB to $USER..."
mysql -h "$HOST" -u "$USER" -p"$PASSWORD" -e "GRANT EXECUTE ON $DB.* TO '$USER';"
done
done
echo "All privileges granted!"
注意事項(xiàng)
1.權(quán)限驗(yàn)證:
確保目標(biāo)用戶(hù)在數(shù)據(jù)庫(kù)中已經(jīng)存在。如果用戶(hù)不存在,需要先通過(guò) CREATE USER 創(chuàng)建用戶(hù)。
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
2.FLUSH PRIVILEGES:
有些數(shù)據(jù)庫(kù)需要在權(quán)限更新后運(yùn)行 FLUSH PRIVILEGES 來(lái)刷新權(quán)限表。
FLUSH PRIVILEGES;
3.權(quán)限范圍:
如果只需要對(duì)特定表授予權(quán)限,可以用 GRANT EXECUTE ON db_name.table_name。
4.錯(cuò)誤處理:
如果腳本中出現(xiàn) Access Denied 錯(cuò)誤,可能是當(dāng)前執(zhí)行腳本的用戶(hù)權(quán)限不足。請(qǐng)確保腳本運(yùn)行用戶(hù)擁有足夠權(quán)限(如 GRANT OPTION 權(quán)限)。
5.重復(fù)授權(quán):
MySQL 和其他數(shù)據(jù)庫(kù)通常不會(huì)因?yàn)橹貜?fù)執(zhí)行 GRANT 而出錯(cuò),因此可以放心批量執(zhí)行腳本。
常見(jiàn)問(wèn)題
用戶(hù)不存在錯(cuò)誤:
需要確保所有用戶(hù)已被創(chuàng)建。如果需要自動(dòng)創(chuàng)建用戶(hù),可以擴(kuò)展 Shell 腳本,添加 CREATE USER。
權(quán)限不足:
確保運(yùn)行腳本的用戶(hù)(如 root)具有 GRANT OPTION 權(quán)限。
多數(shù)據(jù)庫(kù)環(huán)境:
如果存在多個(gè)數(shù)據(jù)庫(kù),確保用戶(hù)被授予所有需要的數(shù)據(jù)庫(kù)權(quán)限。
以上就是使用Shell腳本批量執(zhí)行SQL腳本的詳細(xì)內(nèi)容,更多關(guān)于Shell批量執(zhí)行SQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
awk 九九乘法表 shell實(shí)現(xiàn)代碼
這篇文章主要介紹了awk 九九乘法表 shell實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-03-03
通過(guò)Shell腳本批量創(chuàng)建服務(wù)器上的MySQL數(shù)據(jù)庫(kù)賬號(hào)
公司有數(shù)百臺(tái) MySQL 實(shí)例,如果手動(dòng)登入來(lái)創(chuàng)建賬號(hào)很麻煩,也不現(xiàn)實(shí)。所以,我們寫(xiě)了一個(gè)簡(jiǎn)單的shell腳本,用來(lái)創(chuàng)建批量服務(wù)器的mysql 賬號(hào)。這篇文章主要介紹了通過(guò)Shell腳本批量創(chuàng)建服務(wù)器上的MySQL數(shù)據(jù)庫(kù)賬號(hào)的相關(guān)知識(shí) ,需要的朋友可以參考下2019-07-07
shell腳本發(fā)送http請(qǐng)求的實(shí)現(xiàn)示例
本文主要介紹了shell腳本發(fā)送http請(qǐng)求的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Shell腳本函數(shù)定義和函數(shù)參數(shù)
這篇文章主要介紹了Shell腳本函數(shù)定義和函數(shù)參數(shù),分別介紹了2種自定義函數(shù)的方法,以及定義帶返回值函數(shù)的方法,需要的朋友可以參考下2014-07-07
linux?shell?解析命令行參數(shù)及while?getopts用法小結(jié)
這篇文章主要介紹了linux?shell?解析命令行參數(shù)及while?getopts用法,getpots是Shell命令行參數(shù)解析工具,旨在從Shell?Script的命令行當(dāng)中解析參數(shù),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2022-05-05
linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫(kù)到本地
這篇文章主要介紹了linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫(kù)到本地,需要的朋友可以參考下2015-04-04
Linux更新Python版本及修改python默認(rèn)版本的方法
很多情況下拿到的服務(wù)器python版本很低,需要自己動(dòng)手更改默認(rèn)python版本,但是有好多朋友都被這個(gè)問(wèn)題難倒了,接下來(lái),通過(guò)本篇文章給大家介紹linux更新Python版本及修改默認(rèn)版本的方法,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
Linux全網(wǎng)最全面常用命令整理(附實(shí)例)
這篇文章主要介紹了Linux命令,是目前最全面的集合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

