shell大量匯入mysql資料庫,shellmysql資料庫

來源:互聯網
上載者:User

shell大量匯入mysql資料庫,shellmysql資料庫

因為項目協同開發, 同事發了一個項目的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 <rainysia@gmail.com>#date       2014-11-14 10:26:27set -eLC_ALL=CLANG=Cunset TZTZBase=$(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  secondssource: "/home/db/test/hml3.sql" is ok, It takes  19  secondssource: "/home/db/test/hml4.sql" is ok, It takes  18  secondsAll 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 改成需要刪除的資料庫名, 運行一下即可.




相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.