复制表结构或是数据
写在前面
原文链接https://www.cnblogs.com/phpper/p/10773004.html
link
Mysql 5.6.51 GTID复制
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID,自增',
`uid` bigint(11) UNSIGNED NOT NULL DEFAULT 0 COMMENT '用户uid',
`nickname` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '昵称',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
PRIMARY KEY (`id`) USING BTREE,
INDEX `unn`(`uid`, `name`, `nickname`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES (3, 100, 'kaven', 'test3');
INSERT INTO `t1` VALUES (2, 101, 'maha', 'test2');
INSERT INTO `t1` VALUES (4, 102, 'loose', 'test4');
INSERT INTO `t1` VALUES (5, 105, 'balala', 'test5');
create table t1_copy as select * from t1 where 1=2
或
create table t1_copy as select * from t1 limit 0
只需要表结构,所以上面的 where 1=2 或lmit 0 查询的是空数据。我们会发现新表t1_copy没有索引
补充:如果要复制数据,去掉limit 0即可或是where 1=1,也就是查询到的所有数据复制
create table t1_copy2 like t1
注意:两种方式在复制表的时候是不会复制权限对表的设置。比如说原本对表A做了权限设置,复制表AA后,表AA并不具备类似于表A的权限。(表权限不会复制)
开启GTID是数据库,不能as
create table t1_copy as select * from t1 where 1=2;
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.
问题分析:
MySQL开启gtid以后就不能使用了,MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行,像create table … select 和 create temporarytable语句,以及同时更新事务表和非事务表的SQL语句或事务都不允许执行
show global variables like '%gtid_mode%'; on
分两步:
1.
create table t1_copy2 like t1
2.
insert into t1_copy2 select * from t1;
不推荐的方式:
并且最好是MySQL5.7。开启/关闭GTID,不用重启服务
1.关闭gtid(这种方式较为麻烦):
set global gtid_mode='ON_PERMISSIVE';
set global gtid_mode='OFF_PERMISSIVE';
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = OFF;
set global gtid_mode='OFF';
2.执行as复制结构或是数据的操作。
3.再次开启:
set global gtid_mode='OFF_PERMISSIVE';
set global gtid_mode='ON_PERMISSIVE';
SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
set global gtid_mode='ON';
show global variables like '%gtid_mode%'; 确认状态为ON
随便提一下SQL Server的语法,oracle支持as,也是只有表结构没有索引;oracle不支持like。
select * into table_new
from table_old
where 1 = 2 --只复制表结构
select * into table_new
from table_old
where 1 = 1 --复制表结构和数据
本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删