返回顶部
首页 > 资讯 > 数据库 >Mysql复制表三种实现方法及grant解析
  • 703
分享到

Mysql复制表三种实现方法及grant解析

Mysql复制表grant 2022-05-24 11:05:30 703人浏览 安东尼
摘要

如何快速的复制一张表 首先创建一张表db1.t,并且插入1000行数据,同时创建一个相同结构的表db2.t 假设,现在需要把db1.t里面的a>900的数据行导出来,插入到db2.t中 mysqldump方法

如何快速的复制一张表

首先创建一张表db1.t,并且插入1000行数据,同时创建一个相同结构的表db2.t

假设,现在需要把db1.t里面的a>900的数据行导出来,插入到db2.t中

mysqldump方法

几个关键参数注释:

  • ?single-transaction的作用是,在导出数据的时候不需要对表db1.t加表,而是使用
  • START TRANSACTION WITH CONSISTENT SNAPSHOT的方法;
  • ?no-create-info的意思是,不需要导出表结构;
  • ?result-file指定了输出文件的路径,其中client表示生成的文件是在客户端机器上的。

导出csv文件

select * from db1.t where a>900 into outfile '/server_tmp/t.csv';

这条语句会将结果保存在服务端。如果你执行命令的客户端和Mysql服务端不在同一个机器上,客户端机器的临时目录下是不会生成t.csv文件的。

这条命令不会帮你覆盖文件,因此你需要确保/server_tmp/t.csv这个文件不存在,否则执行语句时就会因为有同名文件的存在而报错。

得到.csv导出文件后,你就可以用下面的load data命令将数据导入到目标表db2.t中。

load data infile '/server_tmp/t.csv' into table db2.t;

打开文件/server_tmp/t.csv,以制表符(\t)作为字段间的分隔符,以换行符(\n)作为记录之间的分隔符,进行数据读取;

启动事务

判断每一行的字段数与表db2.t是否相同:

  • 若不相同,则直接报错,事务回滚;
  • 若相同,则构造成一行,调用InnoDB引擎接口,写入到表中。

重复步骤3,直到/server_tmp/t.csv整个文件读入完成,提交事务。

物理拷贝方法

mysqldump方法和导出CSV文件的方法,都是逻辑导数据的方法,也就是将数据从表db1.t中读出来,生成文本,然后再写入目标表db2.t中。有物理导数据的方法吗?比如,直接把db1.t表的.frm文件和.ibd文件拷贝到db2目录下,是否可行呢?答案是不行的。

因为,一个InnoDB表,除了包含这两个物理文件外,还需要在数据字典中注册。直接拷贝这两个文件的话,因为数据字典中没有db2.t这个表,系统是不会识别和接受它们的。

在Mysql 5.6版本引入了可传输表空间(transportable tablespace)的方法,可以通过导出+导入表空间的方式,实现物理拷贝表的功能。

假设现在的目标是在db1的库下,复制一个跟表t相同的表r,具体执行步骤:

  • 执行create table r like t,创建一个相同表结构的空表,
  • 执行alter table r discard tablespace,这时候r.ibd文件会被删除
  • 执行flush table t for export这时候会生成一个t.cfg
  • 在db1目录下执行cp t.cfg r.cfg; cp t.ibd r.ibd;这两个命令;
  • 执行unlock tables,这时候t.cfg文件会被删除;
  • 执行alter table r import tablespace,将这个r.ibd文件作为表r的新的表空间,由于这个文件的数据内容和t.ibd是相同的,所以表r中就有了和表t相同的数据。

这三种方法的优缺点

物理拷贝的方式速度最快,尤其对于大表拷贝来说是最快的方法。但必须是全拷贝,不能是部分拷贝,需要到服务器上拷贝数据,在用户无法登录数据库主机时无法使用,而且源表和目标表都必须是innodb引擎。

用mysqldump生成包含INSERT语句文件的方法,可以在where参数增加过滤条件,来实现只导出部分数据。这个方式的不足之一是,不能使用join这种比较复杂的where条件写法。

用select … into outfile的方法是最灵活的,支持所有的SQL写法。但,这个方法的缺点之一就是,每次只能导出一张表的数据,而且表结构也需要另外的语句单独备份。

后两种都是逻辑备份方式,可以跨引擎使用的。

mysql全局权限

SELECT * FROM MYSQL.USER WHERE USER='UA'\G 显示所有权限

作用域整个mysql,信息保存在mysql的user表里

赋予用户ua一个最高权限:

grant all privileges on *.* to 'ua'@'%' with grant option;

这个grant命令做了两个动作:分别将磁盘中的mysql.user表里将权限的字段都修改为Y,和内存中的acl_user中用户对应的对象将access值修改为‘全1'

如果有新的客户端使用用户名ua登录成功,mysql会为新连接维护一个线程对象,所有关于全局权限的判断,都是直接使用线程对象内部保存的权限位。

grant命令对于全局权限,同时更新了磁盘和相应的内存,接下来新创建的连接会使用新的权限
对于已经存在的连接,它的全局权限不受grant的影响。
如果要回收上面权限:

revoke all privileges on *.* from 'ua'@'%';

同样也是相对应的两个操作,磁盘中权限字段修改位N,内存中对象的access的值修改位0。

mysqlDB权限

grant all privileges on db1.* to 'ua'@'%' with grant option;

使用SELECT * FROM MYSQL.DB WHERE USER = 'UA'\G来查看当前用户的db权限,同样的也是对磁盘和内存中的对象修改权限。

db权限存储在mysql.db表中

注意:和全局权限不同,db权限会对已经存在的连接对象产生影响。

mysql表权限和列权限

表权限放在mysql.tables_priv中,列权限存放在mysql.columns_priv中,这两类权限组合起来存放在内存的hash结构column_priv_hash中。

跟db权限类似,这两个权限每次grant的时候都会修改数据表,也会同步修改内存中的hash结构,因此,这两类权限的操作,也会影响到已经存在的连接。

flush privileges的使用场景

有些文档里提到,grant之后马上执行flush privileges命令,才能使赋权语句生效。其实更准确的说法应该是在数据表中的权限跟内存中的权限数据不一致的时候,flush privileges语句可以用来重建内存数据,达到一致状态。

比如某时刻删除了数据表的记录,但是内存的数据还存在,导致了给用户赋权失败,因为在数据表中找不到记录。
同时重新创建这个用户也不行,因为在内存判断的时候,会认为这个用户还存在。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql复制表三种实现方法及grant解析

本文链接: https://lsjlt.com/news/9818.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mysql复制表三种实现方法及grant解析
    如何快速的复制一张表 首先创建一张表db1.t,并且插入1000行数据,同时创建一个相同结构的表db2.t 假设,现在需要把db1.t里面的a>900的数据行导出来,插入到db2.t中 mysqldump方法...
    99+
    2022-05-24
    Mysql 复制表 grant
  • MySQL复制表的三种方式(小结)
    复制表结构及其数据 下面这个语句会拷贝数据到新表中。 注意:这个语句其实只是把select语句的结果建一个表,所以新表不会有主键,索引。 create table table_name_new as ...
    99+
    2022-05-12
    MySQL 复制表
  • Android 三种实现定时器详解及实现方法
    方法一:Handler+Thread package com.xunfang.handerDemo; import android.app.Activity; impor...
    99+
    2022-06-06
    方法 定时器 Android
  • Python实现解析参数的三种方法详解
    目录先决条件使用 argparse使用 JSON 文件使用 YAML 文件最后的想法今天我们分享的主要目的就是通过在 Python 中使用命令行和配置文件来提高代码的效率 Let&#...
    99+
    2024-04-02
  • Golang实现解析JSON的三种方法总结
    目录背景示例Json例子解释1)反序列化成map2)反序列化成对象3)复杂json的解析总结背景 这是一篇写给0-1年新人的文章,短平快的教会你如何解析json字符串。 示例Json...
    99+
    2024-04-02
  • Python实现列表删除重复元素的三种常用方法分析
    本文实例讲述了Python实现列表删除重复元素的三种常用方法。分享给大家供大家参考,具体如下: 给定一个列表,要求删除列表中重复元素。 listA = ['python','语','言','是','一'...
    99+
    2022-06-04
    三种 元素 常用
  • MariaDB三种方法安装及多实例实现
    本章内容Mariadb的三种安装方式:    1、程序包管理器管理的程序包    2、二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用...
    99+
    2024-04-02
  • Android定制RadioButton样式三种实现方法
    三种方法 1.使用XML文件进行定义 res/drawable/radio.xml 代码如下: <xml version="1.0" encoding="utf-8"&...
    99+
    2022-06-06
    radiobutton 方法 Android
  • 比较Ajax三种实现及JSON解析的示例分析
    这篇文章给大家分享的是有关比较Ajax三种实现及JSON解析的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。准备:1、  prototype.js2、 ...
    99+
    2024-04-02
  • Mysql复制表结构、表数据的主要几种方法
    下文主要给大家带来Mysql复制表结构、表数据的主要几种方法,希望这些内容能够带给大家实际用处,这也是我编辑Mysql复制表结构、表数据的主要几种方法这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。...
    99+
    2024-04-02
  • Mysql复制Replication的实现方法
    本篇内容主要讲解“Mysql复制Replication的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mysql复制Replication的实现方法”吧...
    99+
    2024-04-02
  • AJAX请求数据及实现跨域的三种方法详解
    目录传统方法的缺点:什么是ajax?XMLHttpRequest 对象五步使用法:同步和异步的区别:如何将原生ajax进行封装JS几种跨域方法和原理附:ajax跨域post请求的ja...
    99+
    2024-04-02
  • Android编程实现XML解析与保存的三种方法详解
    本文实例讲述了Android编程实现XML解析与保存的三种方法。分享给大家供大家参考,具体如下:简介在Android开发中,关于XML解析有三种方式,分别是: SAX 基于事件的解析器,解析速度快,占用内存少。非常适合在Android移动设...
    99+
    2023-05-30
    android xml roi
  • PHP连接MySQL数据库三种实现方法
    引言 PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案。 PHP的...
    99+
    2022-05-23
    PHP 连接 MySQL 数据库
  • win8.1系统玩剑网三出现闪退的三种原因分析及解决方法
    剑网三是一款3D武侠角色扮演电脑客户端游戏,很多游戏玩家都喜欢玩这款游戏,可是在游戏过程中会遇到一个问题。最常见就是win8.1系统玩剑网三出现闪退,什么原因导致呢?如何解决win8.1系统玩剑网三出现闪退...
    99+
    2022-06-04
    三种 解决方法 剑网
  • vue使用 vue-socket.io三种方式及踩坑实例解析
    目录前言安装使用方式一 (官方用法)[全局挂载,不验证]使用方式二 (组件挂载使用)[可验证]使用方式三 (全局挂载使用)[可验证]使用方式推荐nodejs服务端本地demo代码总结...
    99+
    2024-04-02
  • MySQL主从复制的实现方法
    这篇文章给大家分享的是有关MySQL主从复制的实现方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。          &nbs...
    99+
    2024-04-02
  • C# 实现Eval(字符串表达式)的三种方法
    目录一、背景二、代码三、测试一、背景 假如给定一个字符串表达式"-12 * ( - 2.2 + 7.7 ) - 44 * 2",让你计算结果,熟悉JavaScript的都知道有个E...
    99+
    2024-04-02
  • DedeCMS实现MySQL修复表的方法
    很多Dedecms的用户会经常碰到数据表出现报错“dede_search_keywords' is marked as crashed and should be repaired”,这个说明你的...
    99+
    2022-06-12
    DedeCMS MySQL 修复表
  • Python 列表(List) 的三种遍历方法实例 详解
    Python 遍历 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,下面废话不多说,直接贴代码 #!/usr/bin/env python # -*- coding: utf-8 -...
    99+
    2022-06-04
    遍历 三种 详解
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作