首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Shell 腳本批量導出 MySQL 存儲過程為單獨 .sql 文件

     編輯:MySQL 綜合教學

Shell 腳本批量導出 MySQL 存儲過程為單獨 .sql 文件

從 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%')。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved