Mysql
如果不存在則創建表
我仍然是使用數據庫的新手,但目前我正在使用 mysql 數據庫並試圖使我的 bash 腳本牢不可破,因為它可能用於幾種不同的環境(dev、qa 等)。我知道它會在沒有這一行的情況下正常執行。
CREATE TABLE IF NOT EXISTS backupfiles (fileName VARCHAR(20), archiveId VARCHAR(500), checkSum VARCHAR(100), glacierVault VARCHAR(100), timeStamp date);
我也知道,如果我在該表不存在時將該確切行放入我的數據庫中,那麼它會完美執行,如果它已經存在,它會給我一個警告,但不會中斷。
+-------+------+------------------------------------+ | Level | Code | Message | +-------+------+------------------------------------+ | Note | 1050 | Table 'backupfiles' already exists | +-------+------+------------------------------------+
當我執行上面的行並且沒有名為 backupfiles 的表時,它工作得很好,但是當它掛起時(當我說掛起時,它就坐在那裡,什麼也不做)95% 的時間和 5% 的時間工作。有沒有人遇到過這樣的問題?我正在使用 AWS RDS(亞馬遜網路服務關係數據庫服務),mysql 伺服器是 5.5.27
這是我與mysql數據庫相關的所有程式碼
mysql -h portal-rds -u $user --password=$mysqlpw <<QUERY_INPUT CREATE DATABASE IF NOT EXISTS $DATABASE; use $DATABASE; CREATE TABLE IF NOT EXISTS backupfiles (fileName VARCHAR(20), archiveId VARCHAR(500), checkSum VARCHAR(100), glacierVault VARCHAR(100), timeStamp date); INSERT INTO backupfiles VALUES ('$archive_file_name', '$archiveID', '$CURRENTVAULT', '$checkSum', CURDATE()); COMMIT; QUERY_INPUT
我覺得這令人不安有兩個原因
原因 #1
這可能是一個從未從 MySQL 5.5.17 中消除的錯誤
Nov 08, 2011
:http : //bugs.mysql.com/bug.php?id=63144(狀態是 MySQL 5.5.17 上的需要分類)Mar 21, 2011
: http://bugs.mysql.com/bug.php?id=60563 (MySQL 5.5.10)Jun 23, 2006
: http://bugs.mysql.com/bug.php?id=20662原因 #2
您正在嘗試在 RDS 環境中獲取 InnoDB 表上的元數據鎖?哎喲!!!
可能的解決方法
不要信任 RDS 中的元數據鎖定,而是詢問 information_schema 表是否已經存在。假設表是
mydb.backupfiles
。執行此查詢:SELECT COUNT(1) FROM information_schema.tables WHERE table_schema='mydb' AND table_name='backupfiles';
如果答案返回 0,請執行
CREATE TABLE backupfiles ...
。否則,不要執行它。可能的解決方案
升級到最新的 MySQL (5.6.12) 或最新的 MySQL5.5 (5.5.31)。希望這個問題在更新的版本中得到解決
試一試 !!!
更新 2013-07-11 15:16 EDT
這是您的 bash 程式碼的重寫,以檢查表是否已存在
echo "CREATE DATABASE IF NOT EXISTS $DATABASE;" > /tmp/runthis.sql echo "use $DATABASE;" >> /tmp/runthis.sql SQLSTMT="SELECT COUNT(1) FROM information_schema.tables" SQLSTMT="${SQLSTMT} WHERE table_schema='${DATABASE}' AND table_name='backupfiles';" TABLE_EXISTS=`mysql -h portal-rds -u $user --password=$mysqlpw -ANe"${SQLSTMT}"` if [[ ${TABLE_EXISTS} -eq 0 ]]; then SQLSTMT="CREATE TABLE backupfiles (fileName VARCHAR(20)," SQLSTMT="${SQLSTMT} archiveId VARCHAR(500), checkSum VARCHAR(100)," SQLSTMT="${SQLSTMT} glacierVault VARCHAR(100), timeStamp date);" echo "${SQLSTMT}" >> /tmp/runthis.sql fi SQLSTMT="INSERT INTO backupfiles VALUES ('$archive_file_name'," SQLSTMT="${SQLSTMT} '$archiveID', '$CURRENTVAULT', '$checkSum', CURDATE());" echo "${SQLSTMT}" >> /tmp/runthis.sql echo "COMMIT;" >> /tmp/runthis.sql mysql -h portal-rds -u $user --password=$mysqlpw < /tmp/runthis.sql