一次性刪除Mysql數據庫中所有表的數據,保留表結構

        常見的刪除數據庫表中數據的方法是通過delete或者truncate的方法進行刪除操作,如果刪除的是表中某一條或者部分數據的話適合用delete操作進行刪除,如果要刪除表中所有的數據的話,適合是同truncate進行刪除操作。

        那麼問題來了,如果某一個數據庫中有很多張表,此時我想將該數據庫中所有表中的數據全部刪掉,該如何操作呢?

        解決該問題主要分兩種情況,如果不需要保留數據庫中所有表的結構,那麼答案很簡單,執行命令drop database 數據庫名  即可達到目的。但是如果需要保留該數據庫中所有表的結構,只想刪除所有表中的數據,又該怎麼解決呢?有人會說可以多執行幾次truncate操作就OK啦,沒錯,多執行幾次truncate確實可以達到目的,但是,如果要刪除的數據庫中有很多張表,幾十張上百張表,執行上百次truncate操作顯然不是好的辦法?至此,就是本文要說講到的辦法了。

        刪除的辦法其實還是執行truncat方法,只是不需要每次手動的輸入truncate命令進行刪除。通過sql命令的方式生成所有的truncate語句並寫入到.sql腳本文件中,然後執行腳本即可完成刪除操作,並且保留了表結構。

        生成truncate命令的sql語句爲:SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';

        然後將生成的.sql腳本拷貝到當前文件夾下面:mv /tmp/truncate_test.sql $current_dir/

        然後執行.sql腳本將數據庫中所有表中數據刪除:source $current_dir/truncate_test.sql

        說明:

        在進行select....into outfile......操作時,默認只能將文件寫入到tmp路徑下,可以不用將tmp文件夾下面的.sql腳本移動到當前文件夾下,直接在tmp路徑下執行.sql腳本即可。如果要寫入到其他路徑下,需要給mysql的守護進程賦寫操作的權限,最簡單的辦法是將/etc/selinux路勁下的config配置文件中的SELINUX修改成disabled可以實現寫入其他路徑下,這裏不展開說明。

        結合上一篇博文mysql數據庫的備份和恢復,下面貼出一個小腳本的源碼和運行截圖。使用該腳本進行數據備份和恢復時,源和目的數據庫中的所有表結構需要一致,否則執行可能出錯。該腳本主要實現mysql數據庫的備份和恢復,以及一次刪除整個數據庫中所有表數據並保留數據表結構。

        運行結果截圖說明:

        

        1):備份test數據庫中的所有數據

        2):恢復數據

        3):刪除數據庫test中所有表中的所有數據,並保留表結構

       

        腳本源碼:

#/bin/bash
while [ 1 ]
do
    echo "  #############################################" 
    echo "           Quick Backup and Recovery"                   
    echo "    Source and Destination Mysql Must Be Same"
    echo "  #############################################"
    echo "    1) Back up database test"
    echo "    2) Recovery database test"
    echo "    3) Clear data in database test"
    echo "    q) Quit"
    echo -n " Your Option:"
    read option_char

    current_dir=$(pwd)
    case ${option_char} in
        "1")
    	    rm -f $current_dir/test_bk.sql
            mysqldump -t -c -uroot -proot test > $current_dir/test_backup.sql
            echo " Database test already backup..."
            ;;
        "2")
            mysql -u root --password='root' -e "
	    use test
            source $current_dir/test_backup.sql"
            echo " Database test already recovery..."
            ;;
        "3")
            rm -f $current_dir/truncate_test.sql
	    chmod 777 $current_dir
            mysql -u root --password='root' -e "
            SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';"
	    mv /tmp/truncate_test.sql $current_dir/
    	    mysql -u root --password='root' -e "
	    use test
	    source $current_dir/truncate_test.sql"
            echo " Clear data of test successful..."
            ;;
        "q"|"quit"|"exit"|'Q'|"QUIT"|"Quit")
	    break
	    ;;
        *)
            echo "your option is invalid, please input again..."
            ;;
    esac
done



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章