測試時,有時要清空數據庫很多數據,由於有些表有關聯,所以干脆所有表數據都清除.
我的思路是:先備份一個只有表結構的sql,再備份一些保存業務配置的表,再把原來的數據庫drop,再創建一個新的數據庫,再source一下還原表結構,再還原保存業務配置的表.由於經常要清空數據庫,於是寫了一個小腳本,還是學到很多東西.
這個小腳本花了兩天時間,我是做測試的,也是一個很怕代碼的人,一直在逃避.有時可以寫些小腳本,但是要花費更多的時間好像不值得.所以就每次都是手動做.要改變思維,克服困難.加油.
1.保留數據表結構,只刪除所有表數據
方法1:導出一個沒有數據的數據庫,再drop原來的數據庫,create 一個新的(空的,沒有表結構),再source一下之前導出的沒有數據的sql
mysqldump -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} --no-data >villadb-nodata.sql
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} -e "drop database ${DATABASE}"
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} -e "create database ${DATABASE}"
方法2:之前看到一個用truncate的方法,因為truncate效率高,只刪除數據,跟delete類似,又有所不同.上面有說到兩者的區別.
mysql -uroot -pengine -h127.0.0.1 -e "select CONCAT('truncate TABLE ',table_schema,'.',table_name) from information_schema.TABLES where table_schema ='villadb'" > all.sql
vim all.sql,把第一行刪掉,在命令行模式下輸入":1,$ s/$/;/g" ,所有行尾加";"
[clouder@ana53 useful-sql]$ mysql -uroot -pengine -h127.0.0.1 -e "source all.sql"
ERROR 1701 (42000) at line 5 in file: 'all.sql': Cannot truncate a table referenced in a foreign key constraint (`villadb`.`ContinuousPublishInform`, CONSTRAINT `ContinuousPublishInform_ibfk_1` FOREIGN KEY (`projectOutputId`) REFERENCES `villadb`.`ContinuousPublish` (`id`))
ERROR 1146 (42S02) at line 23 in file: 'all.sql': Table 'villadb.ProjectCloudView' doesn't exist
ERROR 1146 (42S02) at line 31 in file: 'all.sql': Table 'villadb.ServiceOffering' doesn't exist
ERROR 1701 (42000) at line 40 in file: 'all.sql': Cannot truncate a table referenced in a foreign key constraint (`villadb`.`ContinuousPublishInform`, CONSTRAINT `ContinuousPublishInform_ibfk_2` FOREIGN KEY (`userId`) REFERENCES `villadb`.`User` (`id`))
報錯是因為有些表有關聯,所以無法被刪除,所以推薦用第一個方法刪除數據庫所有表的數據.這只是一個思路哈.
總結學習點:
1.mysql -e cmd 可以用shell操作mysql,不在mysql提示符下操作,非交互式,適合嵌入shell腳本
2.shell 單引號和雙引號的區別,單引號屬於強引用,不對引號內任何特殊字符轉義,只當普通字符.雙引號屬於弱引用,會對括起來的特殊字符做處理.如$,>等.上面的例子用到${DATABASE},要用雙引號,才能保留${}的特殊意義,即傳遞一個變量,而不是簡單字符串.
3.mysqldump --no-data 參數(跟-d 一樣),表示只導出數據庫表結構,不導出數據.用-t則表示只導出數據,不導出表結構.
4.刪除數據庫有3種方法:(delete有所保留,可以回滾,drop更徹底)
-
delete from table where
直接刪除表中的某一行數據,並且同時將該行的刪除操作作為事務記錄在日志中保存以便進行進行回滾操作。所以delete相比較truncate更加占用資源,數據空間不釋放,因為需回滾。對table和view都能操作 -
truncate table
一次性地從表中刪除所有的數據(釋放存儲表數據所用的數據頁來刪除數據)並不把單獨的刪除操作記錄記入日志保存(只在事務日志中記錄 頁的釋放),因此也不能回滾,不能恢復數據,在刪除的過程中不會激活與表有關的刪除觸發器,占用資源更加少,速度更快。數據空間會釋放,這個表和索引所占用的空間會恢復到初始大小。只能操作沒有關聯視圖的table
由於 TRUNCATE TABLE 不記錄在日志中,所以它不能激活觸發器,對於外鍵(foreignkey )約束引用的表,不能使用 truncate table,而應使用不帶 where 子句的 delete 語句。
truncate table不能用於參與了索引視圖的表 -
drop table
刪除的是整個表,包括表的結構,數據,定義。永久抹去,空間釋放。對table和view都能操作
5.vim 的六種模式
- 普通模式Normal mode:默認進入就是普通模式,可以移動,和用delete刪除
- 插入模式Insert mode:按a,A,i,I,o,O都可以進入.a表示在當前字符后面追加,A表示在行末,,i表示在光標位置插入,I表示在行首,o表示在下一行,O表示在上一行;
- 可視模式Visual mode:按ctrl+v進入,可以用來排版,如多行縮進:ctrl+v進入可視模式,光標選中連續多行,按"shift+>"或"shift+<"批量縮進
- 選擇模式Select mode:不清楚
- 命令行模式CommandLine mode:按Esc退出到命令行模式,輸入":"執行命令,"/"加關鍵字表示從當前行向下搜索,"?"加關鍵字表示從當前行向上搜索
- Ex模式Ex mode:不清楚
6.echo 帶顏色顯示,試一下吧.
-e是echo的一個可選項,用於激活特殊字符的解析器, 也就是對反斜線轉義符(即\)的解釋。\033引導非常規字符序列。意味着設置屬性然后結束非常規字符序列,這里起效果的字符是
47;30;5和0。修改47;30;5可以生成不同顏色的組合,數值和編碼的前后順序沒有關系
echo -e "\033[20;1H\033[1;4;32m david use echo say \033[0m Hello World \n"
范圍
0 重新設置屬性到缺省設置
1 設置粗體
2 設置一半亮度(模擬彩色顯示器的顏色)
4 設置下划線(模擬彩色顯示器的顏色)
5 設置閃爍
7 設置反向圖象
8 消隱
22 設置一般密度
24 關閉下划線
25 關閉閃爍
27 關閉反向圖象
// 字體顏范圍(前景顏色):30~39
30:黑
31:紅
32:綠
33:黃
34:藍色
35:紫色
36:深綠
37:白色
38:在缺省的前景顏色上設置下划線
39:在缺省的前景顏色上關閉下划線
// 字背景顏色范圍(背景顏色):40~49
40:黑
41:深紅
42:綠
43:黃色
44:藍色
45:紫色
46:深綠
47:白色
nA 光標上移n行
nB 光標下移n行
nC 光標右移n行
nD 光標左移n行
y;xH設置光標位置
2J 清屏
K 清除從光標到行尾的內容
s 保存光標位置
u 恢復光標位置
?25l 隱藏光標
?25h 顯示光標
---------------------
作者:魔小明
來源:CSDN
原文:https://blog.csdn.net/david_dai_1108/article/details/70478826
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
7.shell自定義函數
function func_name()
{
if [ $1 -eq $2 ];then
echo "$1 = $2"
else
echo "$1 = $2"
fi
}
func_name 2 4
1.shell的函數,不需要在函數定義時寫上參數,只需要在調用函數時傳遞
2.if判斷,用"[]"中括號括起,並且前后要留一個空格
3.比較:數字比較用-eq,-lt,-gt,-le,-ge; 字符串比較用=,!=,in;文件判斷用-f,-d,-r,-w
調試時用到的技巧
1.shell腳本在開頭加上"set -x"表示調試模式,會把每句命令都打印出來,再打印每句命令的執行結果
2.vim中批量注釋.用vim命令打開文件
方法1:可視模式visual mode
- 批量注釋:光標移動到要注釋的第一行,按ctrl+v進入塊模式,按方向鍵向下,直到你要注釋的最后一行,按大寫的i,注意大寫的哦,輸入#,再按2次Esc鍵,就看到選中的行首都增加了一個#.
- 取消注釋:在塊模式下選中要取消注釋的行,按一下"d",即可
方法2:替換命令
- 批量注釋:按Esc進入命令行模式command mode,輸入":set nu",顯示行號;再按一下Esc,輸入":1,$ s/^/#/g" 表示從1到最后一行,每個行首都增加# . 其中"1,$" 表示從1到最后一行,可更改為實際的起始行和結束行
- 取消注釋:在命令行模式,輸入":1,$ s/^#//g"
3.vim命令行下常用設置:
nohl:取消高亮
set nu:顯示行數
set nonu :不顯示行數
最后附我寫的完整腳本
#!/usr/bin/bash
set -x
HOSTNAME='127.0.0.1'
USERNAME='root'
PASSWORD='engine'
DATABASE='villadb'
result()
{
if [ $? -eq 0 ];then
echo -e "\033[47;32m ----------- $1 succeed! ---------- \033[0m"
else
echo -e "\033[47;31m ----------- $1 failed! ----------- \033[0m"
fi
}
echo -e "\033[47;34m ------------ step 1: dump a no-data sql of villadb ------------- \033[0m"
mysqldump -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} --no-data >villadb-nodata.sql
result step1
echo -e "\033[47;34m ------------ step 2: dump important config like VDC,ServiceOffering,etc ------------- \033[0m"
mysqldump -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} VdcType ServiceOffering TotalTemplate VDC Configuration > config.sql
result step2
echo -e "\033[47;34m ------------ step 3: drop villadb ------------- \033[0m"
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} -e 'drop database villadb'
result step3
echo -e "\033[47;34m ------------ step 4: create a new villadb ------------- \033[0m"
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} -e 'create database villadb IF NOT EXISTS villadb'
result step4
echo -e "\033[47;34m ------------ step 5: import the backup table-structure ------------- \033[0m"
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} -e 'source /home/clouder/userful-sql/villadb-nodata.sql'
result step5
echo -e "\033[47;34m ------------ step 6: import the backup config ------------- \033[0m"
mysql -u${USERNAME} -p${PASSWORD} -h${HOSTNAME} ${DATABASE} -e 'source /home/clouder/userful-sql/config.sql'
result step6
參考:
刪除數據庫的3種方式:
https://blog.csdn.net/u010735147/article/details/81872034
echo 帶顏色:
https://blog.csdn.net/david_dai_1108/article/details/70478826
mysql導出數據庫表結構:
https://www.cnblogs.com/xiaoleiel/p/8316685.html
mysql只刪除數據庫所有表數據,保留數據結構:
https://blog.csdn.net/iw1210/article/details/79586033
vim的幾種模式:
https://www.cnblogs.com/shiyanlou/archive/2017/09/05/7478346.html
if判斷:
https://www.cnblogs.com/kairo/p/6646774.html