From ccf10f64c0d12da837e8035b107cfdcd5fd40caa Mon Sep 17 00:00:00 2001 From: Antergone Date: Wed, 20 Dec 2017 03:23:58 +0800 Subject: [PATCH] check schema and table before create it (#3716) --- physical/mysql/mysql.go | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/physical/mysql/mysql.go b/physical/mysql/mysql.go index 87daa9a461b6..018f9fb55066 100644 --- a/physical/mysql/mysql.go +++ b/physical/mysql/mysql.go @@ -100,16 +100,39 @@ func NewMySQLBackend(conf map[string]string, logger log.Logger) (physical.Backen db.SetMaxOpenConns(maxParInt) + // Check schema exists + var schemaExist bool + schemaRows, err := db.Query("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = ?", database) + if err != nil { + return nil, fmt.Errorf("failed to check mysql schema exist: %v", err) + } + defer schemaRows.Close() + schemaExist = schemaRows.Next() + + // Check table exists + var tableExist bool + tableRows, err := db.Query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", table, database) + + if err != nil { + return nil, fmt.Errorf("failed to check mysql table exist: %v", err) + } + defer tableRows.Close() + tableExist = tableRows.Next() + // Create the required database if it doesn't exists. - if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS " + database); err != nil { - return nil, fmt.Errorf("failed to create mysql database: %v", err) + if !schemaExist { + if _, err := db.Exec("CREATE DATABASE IF NOT EXISTS " + database); err != nil { + return nil, fmt.Errorf("failed to create mysql database: %v", err) + } } // Create the required table if it doesn't exists. - create_query := "CREATE TABLE IF NOT EXISTS " + dbTable + - " (vault_key varbinary(512), vault_value mediumblob, PRIMARY KEY (vault_key))" - if _, err := db.Exec(create_query); err != nil { - return nil, fmt.Errorf("failed to create mysql table: %v", err) + if !tableExist { + create_query := "CREATE TABLE IF NOT EXISTS " + dbTable + + " (vault_key varbinary(512), vault_value mediumblob, PRIMARY KEY (vault_key))" + if _, err := db.Exec(create_query); err != nil { + return nil, fmt.Errorf("failed to create mysql table: %v", err) + } } // Setup the backend.