程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> shell批量導入mysql數據庫

shell批量導入mysql數據庫

編輯:MySQL綜合教程

shell批量導入mysql數據庫


因為項目協同開發, 同事發了一個項目的sql文件過來, 打開一看是個目錄, 裡面有上百個數據庫.每個數據庫作為一個單獨的文件.

每個sql文件裡面都有

CREATE DATABASE IF NOT EXISTS `XXXX`
USE `XXXX`;

他可以直接用mysql_workbench 6以上的版本直接導入文件夾的方式來導入多個sql文件. 但是在我的服務器上不可能為了批量導這個sql單獨裝個GUI的workbench.

於是寫個shell吧, 改裡面的host,username和password為你對應的即可.

dbname這裡,默認是sample, mysql裡面的sample表. 實際數據不是導入到這裡面的, 因為我要導入的sql文件裡面都已經有了創建db. 如果你是要導入到某一個數據庫的多個表, 可以修改dbname為你對應的數據庫名

 

#!/bin/bash
#author     rainysia <[email protected]>
#date       2014-11-14 10:26:27


set -e
LC_ALL=C
LANG=C
unset TZ
TZBase=$(LC_ALL=C TZ=UTC0 date -R)
UTdate=$(LC_ALL=C TZ=UTC0 date -d "$TZBase")
TZdate=$(unset TZ ; LANG=C date -d "$TZBase")


file_path="/home/db/test/"              #要導入的sql文件夾
host="192.168.85.123"                   #要導入的mysql主機
username="dbroot"                       #mysql的用戶名
password="db1t#2w$3r@4#t"               #mysql的密碼
dbname="sample"                         #mysql的數據庫名
now=$(date "+%s")                       #計時


mysql_source(){
    for file_name in `ls -A $1`
    do
        seg_start_time=$(date "+%s")
        if [ -f "$1$file_name" ];then
            command="source $1$file_name"
            mysql -h${host} -u${username} -p${password} ${dbname} -e "$command"
            echo "source:" \"$1$file_name\" "is ok, It takes " `expr $(date "+%s") - ${seg_start_time}` " seconds"
        fi
    done


    echo "All sql is done! Total cost: " `expr $(date "+%s") - ${now}` " seconds"
}
echo "Universal Time is now:  $UTdate."
echo "Local time is now:      $TZdate."
mysql_source $file_path

 


 

測試一下,

 

root@debian:/home/sh# ./mysql_source.sh 
Universal Time is now:  Fri Nov 14 03:10:49 UTC 2014.
Local time is now:      Fri Nov 14 11:10:49 CST 2014.
source: "/home/db/test/hml2.sql" is ok, It takes  18  seconds
source: "/home/db/test/hml3.sql" is ok, It takes  19  seconds
source: "/home/db/test/hml4.sql" is ok, It takes  18  seconds
All sql is done! Total costs:  55  seconds

接著發現可以導入了, 然後同事又需要重裝某個app, 需要刪除其中某個數據庫下的所有表. 因為她權限不夠, 不能夠直接刪除數據庫, 只能一個一個手動drop table. 但是有2000多個table.

本來打算使用

SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_schema='cs_china_111數據庫名';

的方式來刪除所有table, 發現沒有生效.

於是還是還是使用上面的shell. 把路徑隨便換個, 現在先去把需要drop的table的sql給寫出來.

先去導出這個數據庫,在終端下使用mysqldump dbroot是我的數據庫用戶名, cs_china_1111是我要導出的數據庫, -d -add-drop-table 是不導出數據只導出結構

 

#mysqldump -udbroot -p cs_china_1111 -d --add-drop-table  > cs_china_1111.sql

 

然後使用grep來過濾一次, 因為導出的sql裡面含有了drop table

 

#find ./ -name "cs_china_1111.sql" | xargs grep "DROP TABLE IF" > cs_china_1111_drop_table.sql

 

接下來用之前的shell, 把dbname 改成需要刪除的數據庫名, 運行一下即可.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved