备份数据库
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8 */; /*!50503 SET NAMES utf8mb4 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DELIMITER // CREATE PROCEDURE `backup_all_table_whether_has_insert`() BEGIN DECLARE var_count INT ; DECLARE var_tbl_name VARCHAR (200) ; DECLARE in_dbname VARCHAR (200) DEFAULT DATABASE(); DECLARE in_if_backup_insert VARCHAR (200) ; DECLARE tbnames CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = in_dbname ; SELECT COUNT(*) INTO var_count FROM information_schema.tables WHERE table_schema = in_dbname ; OPEN tbnames ; SET FOREIGN_KEY_CHECKS = 0 ; SET in_if_backup_insert='insert'; SET @version_backup_all_table_whether_has_insert = LAST_INSERT_ID() ; loop_i : LOOP IF var_count = 0 THEN LEAVE loop_i ; END IF ; FETCH tbnames INTO var_tbl_name ; IF(var_tbl_name != 'backup_table') THEN CALL backup_one_table_create_table_sql ( in_dbname, var_tbl_name, @version_backup_all_table_whether_has_insert ) ; CALL backup_one_table_idx_sql ( in_dbname, var_tbl_name, @version_backup_all_table_whether_has_insert ) ; CALL backup_one_table_fk_sql ( in_dbname, var_tbl_name, @version_backup_all_table_whether_has_insert ) ; IF (in_if_backup_insert = 'insert') THEN CALL backup_one_table_insert_sql ( in_dbname, var_tbl_name, @version_backup_all_table_whether_has_insert ) ; END IF ; END IF ; SET var_count = var_count - 1 ; END LOOP ; CLOSE tbnames ; -- SELECT * FROM backup_table -- WHERE `version` = @version_backup_all_table_whether_has_insert ; SET FOREIGN_KEY_CHECKS = 1 ; END// DELIMITER ; DELIMITER // CREATE PROCEDURE `backup_one_table_create_table_sql`( in_dbname VARCHAR (200), in_table_name VARCHAR (200), in_version VARCHAR (200) ) BEGIN SET @version_backup_one_table_create_table_sql = IF( in_version = '', MD5(UUID()), in_version ) ; SET @version_backup_one_table_create_table_sql = IFNULL( @version_backup_one_table_create_table_sql, MD5(UUID()) ) ; SET SESSION group_concat_max_len = 4294967295 ; SELECT GROUP_CONCAT(t.createTable SEPARATOR "\r\n") INTO @createTable_backup_one_table_create_table_sql FROM (SELECT CONCAT_WS( '', 'create table ', in_table_name, '(' ) AS createTable UNION ALL SELECT CONCAT_WS( '', '`', COLUMN_NAME, '` ', COLUMN_TYPE, ' ', IF( IS_NULLABLE = 'NO', 'NOT NULL', 'NULL' ), ' ', extra, ' ', IF( COLUMN_DEFAULT = NULL, '', CONCAT('default ', COLUMN_DEFAULT) ), ' comment', ' ', "'", COLUMN_COMMENT, "' ," ) FROM information_schema.COLUMNS t1 WHERE t1.table_schema = in_dbname AND t1.TABLE_NAME = in_table_name UNION ALL SELECT 'PRIMARY KEY (`id`) )' UNION ALL SELECT CONCAT_WS( '', ' ENGINE=', ENGINE, ' DEFAULT CHARSET=', SUBSTRING( TABLE_COLLATION, 1, LOCATE('_', TABLE_COLLATION) - 1 ), ' comment=', "'", table_comment, "';" ) FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_dbname AND TABLE_NAME = in_table_name) t ; CREATE TABLE IF NOT EXISTS backup_table ( `id` INT (10) NOT NULL AUTO_INCREMENT COMMENT '物理主键', `create_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `table_name` VARCHAR (200) NOT NULL COMMENT '表名', `version` VARCHAR (200) NOT NULL COMMENT '版本', `type` VARCHAR (200) NOT NULL COMMENT '类型', `md5` VARCHAR (200) COMMENT 'md5值', `str` LONGTEXT COMMENT '语句', PRIMARY KEY (`id`) ) ENGINE = MYISAM AUTO_INCREMENT = 1 AVG_ROW_LENGTH = 0 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '备份记录表' KEY_BLOCK_SIZE = 0 MAX_ROWS = 0 MIN_ROWS = 0 ROW_FORMAT = DYNAMIC ; INSERT INTO backup_table SET table_name = in_table_name, `type` = 'create table', str = @createTable_backup_one_table_create_table_sql, `md5` = MD5( @createTable_backup_one_table_create_table_sql ), `version` = @version_backup_one_table_create_table_sql ; END// DELIMITER ; DELIMITER // CREATE PROCEDURE `backup_one_table_fk_sql`( in_dbname VARCHAR (200), in_table_name VARCHAR (200), in_version VARCHAR (200) ) BEGIN SET @version_backup_one_table_fk_sql = IF( in_version = '', MD5(UUID()), in_version ) ; SET @version_backup_one_table_fk_sql = IFNULL( @version_backup_one_table_fk_sql, MD5(UUID()) ) ; SET SESSION group_concat_max_len = 4294967295 ; SELECT GROUP_CONCAT(t.fk_str SEPARATOR "\r\n") INTO @fk_backup_one_table_fk_sql FROM (SELECT CONCAT_WS( '', 'alter table `', t.TABLE_NAME, '` add constraint ', t.CONSTRAINT_NAME, ' foreign key (`', k.COLUMN_NAME, '`) ', ' REFERENCES ', k.REFERENCED_TABLE_NAME, '(`', k.REFERENCED_COLUMN_NAME, '`);' ) AS fk_str FROM information_schema.TABLE_CONSTRAINTS t JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME AND t.TABLE_NAME = k.TABLE_NAME AND t.CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA WHERE t.CONSTRAINT_TYPE = 'FOREIGN KEY' AND t.table_schema = in_dbname AND t.TABLE_NAME = in_table_name) t ; CREATE TABLE IF NOT EXISTS backup_table ( `id` INT (10) NOT NULL AUTO_INCREMENT COMMENT '物理主键', `create_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `table_name` VARCHAR (200) NOT NULL COMMENT '表名', `version` VARCHAR (200) NOT NULL COMMENT '版本', `type` VARCHAR (200) NOT NULL COMMENT '类型', `md5` VARCHAR (200) COMMENT 'md5值', `str` LONGTEXT COMMENT '语句', PRIMARY KEY (`id`) ) ENGINE = MYISAM AUTO_INCREMENT = 1 AVG_ROW_LENGTH = 0 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '备份记录表' KEY_BLOCK_SIZE = 0 MAX_ROWS = 0 MIN_ROWS = 0 ROW_FORMAT = DYNAMIC ; INSERT INTO backup_table SET table_name = in_table_name, `type` = 'foreign key', str = @fk_backup_one_table_fk_sql, `md5` = MD5(@fk_backup_one_table_fk_sql), `version` = @version_backup_one_table_fk_sql ; END// DELIMITER ; DELIMITER // CREATE PROCEDURE `backup_one_table_idx_sql`( in_dbname VARCHAR (200), in_table_name VARCHAR (200), in_version VARCHAR (200) ) BEGIN SET @version_backup_one_table_idx_sql = IF( in_version = '', MD5(UUID()), in_version ) ; SET @version_backup_one_table_idx_sql = IFNULL( @version_backup_one_table_idx_sql, MD5(UUID()) ) ; SET SESSION group_concat_max_len = 4294967295 ; SELECT GROUP_CONCAT(t.create_index SEPARATOR "\r\n") INTO @createIndex_backup_one_table_idx_sql FROM (SELECT tt.create_index FROM (SELECT IF( t.INDEX_NAME = 'PRIMARY', NULL, CONCAT_WS( '', 'alter table ', in_table_name, ' add ', IF( t.NON_UNIQUE = 0, 'unique index ', ' index ' ), t.INDEX_NAME, ' (`', REPLACE( GROUP_CONCAT( t.column_name ORDER BY t.seq_in_index ), ',', '`,`' ), '`);' ) ) AS create_index FROM information_schema.statistics t WHERE table_schema = in_dbname AND table_name = in_table_name GROUP BY TABLE_NAME, INDEX_NAME) tt WHERE tt.create_index IS NOT NULL) t ; CREATE TABLE IF NOT EXISTS backup_table ( `id` INT (10) NOT NULL AUTO_INCREMENT COMMENT '物理主键', `create_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `table_name` VARCHAR (200) NOT NULL COMMENT '表名', `version` VARCHAR (200) NOT NULL COMMENT '版本', `type` VARCHAR (200) NOT NULL COMMENT '类型', `md5` VARCHAR (200) COMMENT 'md5值', `str` LONGTEXT COMMENT '语句', PRIMARY KEY (`id`) ) ENGINE = MYISAM AUTO_INCREMENT = 1 AVG_ROW_LENGTH = 0 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '备份记录表' KEY_BLOCK_SIZE = 0 MAX_ROWS = 0 MIN_ROWS = 0 ROW_FORMAT = DYNAMIC ; INSERT INTO backup_table SET table_name = in_table_name, `type` = 'create index', str = @createIndex_backup_one_table_idx_sql, `md5` = MD5( @createIndex_backup_one_table_idx_sql ), `version` = @version_backup_one_table_idx_sql ; END// DELIMITER ; DELIMITER // CREATE PROCEDURE `backup_one_table_insert_sql`( IN `in_dbname` VARCHAR (200), IN `in_table_name` VARCHAR (200), IN `in_version` VARCHAR (200) ) BEGIN SET @version_backup_one_table_insert_sql = IF(in_version = '',MD5(UUID()),in_version) ; SET @version_backup_one_table_insert_sql = IFNULL(@version_backup_one_table_insert_sql,MD5(UUID())) ; CREATE TABLE IF NOT EXISTS backup_one_table_insert_sql_temp (str LONGTEXT) ENGINE = MYISAM DEFAULT CHARACTER SET = utf8 ; DELETE FROM backup_one_table_insert_sql_temp ; SET SESSION group_concat_max_len = 4294967295 ; -- ifnull(id,"NULL"),ifnull(order_tech_service_id,"NULL"),ifnull(event_id,"NULL"),ifnull(time,"NULL"), SELECT GROUP_CONCAT( column_name ORDER BY ordinal_position ) INTO @c_backup_one_table_insert_sql FROM (SELECT CONCAT_WS( '', 'ifnull(`', t1.COLUMN_NAME, '`,"NULL")' ) AS column_name, ordinal_position FROM information_schema.COLUMNS t1 WHERE t1.table_schema = in_dbname AND t1.TABLE_NAME = in_table_name) t ; -- `id`,`app_code`,`app_name`,`status`,`description`,`create_time`,`last_update_time` SELECT GROUP_CONCAT( column_name ORDER BY ordinal_position ) INTO @col_list_sql FROM (SELECT CONCAT_WS( '', '`', t1.COLUMN_NAME, '`' ) AS column_name, ordinal_position FROM information_schema.COLUMNS t1 WHERE t1.table_schema = in_dbname AND t1.TABLE_NAME = in_table_name) t ; -- insert into backup_one_table_insert_sql_temp SELECT concat_ws("','",ifnull(`id`,"NULL"),ifnull(`app_code`,"NULL"),ifnull(`app_name`,"NULL"),ifnull(`status`,"NULL"),ifnull(`description`,"NULL"),ifnull(`create_time`,"NULL"),ifnull(`last_update_time`,"NULL")) FROM tbl_app; SET @tb_backup_one_table_insert_sql = CONCAT_WS( '', 'insert into backup_one_table_insert_sql_temp SELECT concat_ws("\',\'",', @c_backup_one_table_insert_sql, ') FROM ', in_table_name, ';' ) ; PREPARE stmt FROM @tb_backup_one_table_insert_sql ; EXECUTE stmt ; DEALLOCATE PREPARE stmt ; -- 表中数据:一行一行的 -- '1','10','华岭应用','2','华岭为业务主体的芯片测试云应用','2014-01-10 00:00:00','2014-01-10 00:00:00' UPDATE backup_one_table_insert_sql_temp SET str = CONCAT_WS( '', 'insert into ', in_table_name, ' (', @col_list_sql , ') ', " values('", REPLACE(str, "'NULL'", 'NULL'), "');" ) ; -- 表中数据:一行一行的。 -- insert into tbl_app values('1','10','华岭应用','2','华岭为业务主体的芯片测试云应用','2014-01-10 00:00:00','2014-01-10 00:00:00'); CREATE TABLE IF NOT EXISTS backup_table ( `id` INT (10) NOT NULL AUTO_INCREMENT COMMENT '物理主键', `create_time` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `table_name` VARCHAR (200) NOT NULL COMMENT '表名', `version` VARCHAR (200) NOT NULL COMMENT '版本', `type` VARCHAR (200) NOT NULL COMMENT '类型', `md5` VARCHAR (200) COMMENT 'md5值', `str` LONGTEXT COMMENT '语句', PRIMARY KEY (`id`) ) ENGINE = MYISAM AUTO_INCREMENT = 1 AVG_ROW_LENGTH = 0 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '备份记录表' KEY_BLOCK_SIZE = 0 MAX_ROWS = 0 MIN_ROWS = 0 ROW_FORMAT = DYNAMIC ; -- 多行聚合成一行 SELECT GROUP_CONCAT(str SEPARATOR "\r\n") INTO @ttt_backup_one_table_insert_sql FROM backup_one_table_insert_sql_temp ; -- 聚合数据插入到表中 INSERT INTO backup_table SET table_name = in_table_name, `type` = 'insert', str = @ttt_backup_one_table_insert_sql, `md5` = MD5( @ttt_backup_one_table_insert_sql ), `version` = @version_backup_one_table_insert_sql ; DROP TABLE backup_one_table_insert_sql_temp ; END// DELIMITER ; DELIMITER // CREATE PROCEDURE `backup_one_table_whether_has_insert`( in_dbname VARCHAR (200), in_table_name VARCHAR (200), in_if_backup_insert VARCHAR (200) ) BEGIN SET @version_backup_one_table_whether_has_insert = MD5(UUID()) ; CALL backup_one_table_create_table_sql ( in_dbname, in_table_name, @version_backup_one_table_whether_has_insert ) ; CALL backup_one_table_idx_sql ( in_dbname, in_table_name, @version_backup_one_table_whether_has_insert ) ; CALL backup_one_table_fk_sql ( in_dbname, in_table_name, @version_backup_one_table_whether_has_insert ) ; IF (in_if_backup_insert = 'insert') THEN CALL backup_one_table_insert_sql ( in_dbname, in_table_name, @version_backup_one_table_whether_has_insert ) ; END IF ; SELECT * FROM backup_table WHERE `version` = @version_backup_one_table_whether_has_insert ; END// DELIMITER ; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;