從 mysql.proc 系統表讀取存儲過程定義,逐個生成包含 DELIMITER、DROP IF EXISTS、CREATE DEFINER 完整語句的 .sql 文件,便於版本控管與遷移部署。
#!/bin/bash
dbcn="mysql -h172.16.1.194 -uroot -p123456"
db="BCReport_Sync_Executor"
mkdir -p /chenenhui/$db
# 獲取存儲過程總數
ct=`$dbcn -N -e "SELECT COUNT(1) FROM mysql.proc WHERE db='$db' AND type LIKE 'P%';"`
ii=0
while [ $ii -lt $ct ]; do
p=$ii
let ii++
# 取得過程名
spname=`$dbcn -N -e "SELECT p.name FROM mysql.proc p WHERE p.db='$db' AND p.type LIKE 'P%' LIMIT $p,1;"`
# 拼接完整 CREATE 語句
ss=`$dbcn -N -e "
SELECT CONCAT(
'DELIMITER $$ USE \`', p.db, '\`$$ DROP PROCEDURE IF EXISTS \`', p.name, '\`$$ ',
'CREATE DEFINER=\`', LEFT(DEFINER, LOCATE('@',DEFINER)-1), '\`@\`', RIGHT(DEFINER, LENGTH(DEFINER)-LOCATE('@',DEFINER)), '\` ',
'PROCEDURE \`', p.name, '\`(', p.param_list, ') ', p.body_utf8,
'$$ DELIMITER ; '
) AS sql_create
FROM mysql.proc p
WHERE p.db='$db' AND p.type LIKE 'P%' AND p.name='$spname';"`
echo -e "$ss" > /chenenhui/$db/$spname.sql
echo "Exported: $spname"
done
echo "_while finished"
mysql.proc 系統表的 body_utf8、param_list、DEFINER 欄位重建標準 DDL。CHAR(36) 即 $,用於構造 DELIMITER $$ 避免分號衝突。mysql.proc 的 SELECT 權限。xargs -P 或 GNU Parallel 加速大量過程導出。type 過濾條件('F%' / 'TR%')。