怎样快速地迁移 MySQL 中的数据?

我们通常会遇到这样的一个场景,就是需要将一个数据库的数据迁移到一个性能更加强悍的数据库服务器上。这个时候需要我们做的就是快速迁移数据库的数据。

那么,如何才能快速地迁移数据库中的数据呢?今天我们就来聊一聊这个话题。

数据库的数据迁移无外乎有两种方式,一种是物理迁移,另一种则是逻辑迁移

首先,我们生成 5 万条测试数据。具体如下:

-- 1. 准备表
create table s1(
  id int,
  name varchar(20),
  gender char(6),
  email varchar(50)
);

-- 2. 创建存储过程,实现批量插入记录
delimiter $$
create procedure auto_insert1()
BEGIN
    declare i int default 1;
    while(i<50000)do
        insert into s1 values(i,'shanhe','male',concat('shanhe',i,'@helloworld'));
        set i=i+1;
        select concat('shanhe',i,'_ok');
    end while;
END$$
delimiter ;

-- 3. 查看存储过程
show create procedure auto_insert1\G 

-- 4. 调用存储过程
call auto_insert1()
复制代码

逻辑迁移

逻辑迁移的原理是根据 MySQL 数据库中的数据和表结构转换成 SQL 文件。采用这一原理常用的迁移工具有 mysqldump

下面我们就来测试一下:

[root@dxd ~]# mysqldump -h172.17.16.2 -uroot -pTest123!  s1 s1 --result-file=/opt/s1.sql

[root@dxd ~]# ll /opt/
-rw-r--r--  1 root root 2684599 5月  10 00:24 s1.sql
复制代码

我们可以看到的是,生成了相应的 SQL 。现在我们通过生成的 SQL 迁移到另一个数据库中。

mysql> use s2;
Database changed

mysql> source /opt/s1.sql
复制代码

通过简单的时间累加计算,大约消耗了 1 秒钟的时间,但是随着数据库递增,迁移的时长也会相应地增加。此时,如果需要迁移的数据表中的数据足够大(假设上千万条),mysqldump 很有可能会将内存撑爆进而导致迁移失败。所以,在迁移这样的数据表的时候,我们可以简单优化一下 mysqldump ,具体如下。

  • --add-locks=0:这个参数表示在迁移数据的时候不加 LOCK TABLES s1.s1 WRITE;,也就是说在导入数据时不锁定数据表。
  • --single-transaction:表示的是在导出数据时,不锁定数据表。
  • --set-gtid-purged=OFF:表示在导入数据时,不输出 GTID 相关的信息。

加上这三个参数主要是为了减少所有的操作导致不必要的 IO ,具体如下:

[root@dxd ~]# mysqldump -h172.17.16.2 -uroot -pTest123! --add-locks=0 --single-transaction --set-gtid-purged=OFF s1 s1 --result-file=/opt/s1.sql
复制代码

通过上面的案例,我们看最终结果,优化的效果微乎其微。所以,这种逻辑优化的方式,在数据量比较大的情况下(百万条以上)不可取。

文件迁移

文件迁移顾名思义就是直接迁移数据库的存储文件。这种迁移方式相对于逻辑迁移的方式来说,性能上要高出很多,同时也很少会把内存撑爆;在面对数据量较大的场景下迁移数据,建议使用文件迁移的方式,具体如下:

mysql> select * from s1 into outfile '/var/lib/mysql-files/1.txt';
Query OK, 55202 rows affected (0.04 sec)
复制代码

我们可以看到的是,将 5 万多条数据导出到文件中时,只花了 0.04 秒左右的时间。相比较 mysqldump 来说快了一倍多。

注意:这种方式导出的数据只能导出到 MySQL 数据库的目录中。配置这个目录的参数是 secure_file_priv,如果不这样做,数据库会报一个 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 的错误。

导出数据之后,我们再将该文件中的数据导入到数据库中,看一下效果,具体如下:

mysql> load data infile '/var/lib/mysql-files/1.txt' into table s3.s1;
Query OK, 55202 rows affected (0.27 sec)
Records: 55202  Deleted: 0  Skipped: 0  Warnings: 0
复制代码

注意:into outfile 是不会生成表结构的,因此在导入数据之前,需要手动创建表结构。

我们可以看出,导入花费的时间总共是0.27秒,相比较 mysqldump 而言,也要快两倍多。

这种方式主要是将每一条数据都以\n换行的方式直接保存在文件之中。

导入的时候,首先会判断导入的数据表的字段是否与每一行的数据的列数一致,如果一致则一行一行地导入,如果不一致则直接报错。

这里面有一个问题需要我们注意,如果我们的数据库是主从架构的数据库,这里很可能就会产生一个问题。讲这个问题之前,我们得首先在这里稍微说明一下主从复制的原理。

主从复制的原理主要是依赖于 binlog 日志,binlog 日志具体步骤如下:

  • 主库上执行 SQL ,并且把修改的数据保存在 binlog 日志之中;
  • 由主库上的 dump 线程转发给从库;
  • 由从库中的 IO 线程接收主库发送过来的 binlog 日志;
  • 将 binlog 日志数据写入中继日志之中;
  • 通过从库上的 SQL 线程从中继日志中重放 binlog 日志,进而达到主从数据一致。

在这个过程之中,我相信仔细阅读本小册第 15 篇文章的朋友一定有一个疑问,当 binlog 日志的工作模式为 STATEMENT 时,在主库上执行上面的 SQL load data infile '/var/lib/mysql-files/1.txt' into table s3.s1; 时,就会导致从库无法重复上方 SQL 的结果,这是因为从库中并没有 /var/lib/mysql-files/1.txt 这个文件。具体步骤如下:

  1. 主库执行 load data infile '/var/lib/mysql-files/1.txt' into table s3.s1;
  2. binlog 日志的工作模式如果是 STATEMENT 时,将在 binlog 中记录上方的 SQL;
  3. 然后在从库中重新执行 binlog 中记录上方的 SQL。

很显然,从库上执行该 SQL 时,会立即报错,这个时候怎么办呢?

这个时候我需要再介绍上方 SQL 的 load 关键字:

  • 如果增加 local 关键字,则该条 SQL 会在本地寻找 /var/lib/mysql-files/1.txt
  • 如果不加 local 关键字,则该条 SQL 会在主库端寻找 /var/lib/mysql-files/1.txt

所以,在主从架构中,要使用文件迁移的方式迁移数据,不加 local 关键字即可。

物理迁移

物理迁移也是迁移文件,所不同是物理迁移一般是直接迁移 MySQL 的数据文件。这种迁移方式性能很好但是操作过程麻烦,容易出错。具体我们来详细解释一下

首先是非常干脆的迁移方式迁移,就是直接 MySQL 数据库的数据文件打包迁移,下面我们做一个案例:

-- 我们将s1数据库中的所有数据迁移到s4数据库之中
[root@dxd mysql]# pwd
/var/lib/mysql
[root@dxd mysql]# cp -r s1 s4
[root@dxd mysql]# chown -R mysql.mysql s4

-- 重启数据库
[root@dxd mysql]# systemctl restart mysqld

-- 查看该表数据
mysql> select count(*) from s1;
ERROR 1146 (42S02): Table 's4.s1' doesn't exist
复制代码

我们可以看到的是查询数据的时候报了一个 1146 的错误,这是因为 INnoDB 存储引擎中的数据表是需要在 MySQL 数据库的数据字典中注册的,我们直接将数据文件复制过去的时候并没有在数据字典中注册,换句话说就是在把数据复制过去之后,还需要在数据字典中注册数据库系统才能正常识别。

下面我们就来介绍一下在数据字典中该如何注册,具体步骤如下。

注:物理迁移数据表数据实际上最主要的就是迁移表空间,因为对于 InnoDB 存储引擎来说,数据是存储在数据表空间中的,也就是.idb文件。

  1. 我们在迁移到的数据库中创建与需要迁移的数据表完全相同的数据表。 mysql> create database t1; Query OK, 1 row affected (0.01 sec) mysql> use t1; Database changed mysql> CREATE TABLE s1 ( -> `id` int(11) DEFAULT NULL, -> `name` varchar(20) DEFAULT NULL, -> `gender` char(6) DEFAULT NULL, -> `email` varchar(50) DEFAULT NULL -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 复制代码 Query OK, 0 rows affected (0.04 sec)
  2. 删除新创建的数据表的表空间,这是因为新创建的数据库的表空间没有数据且会跟迁移过来的数据表空间冲突,我们提前删除,具体删除步骤如下: mysql> alter table t1.s1 discard tablespace; Query OK, 0 rows affected (0.01 sec)
  3. 创建一个原有数据表的配置文件,这样做的目的是将原有数据表的一些配置复制过来(注意:这一步会自动将数据表上锁)。 mysql> use s1; Database changed mysql> flush table s1 for export; Query OK, 0 rows affected (0.01 sec) 查看是否已经创建 .cfg 文件 [root@dxd mysql]# pwd /var/lib/mysql [root@dxd mysql]# ll s1/ 总用量 12312 -rw-r——- 1 mysql mysql 65 5月 10 00:26 db.opt -rw-r——- 1 mysql mysql 520 5月 10 15:15 s1.cfg -rw-r——- 1 mysql mysql 8652 5月 10 00:27 s1.frm -rw-r——- 1 mysql mysql 12582912 5月 10 00:27 s1.ibd
  4. 将配置文件和表空间文件迁移至新的数据库。 复制文件的方式可以灵活多变 [root@dxd mysql]# cp s1/s1.cfg t1/ [root@dxd mysql]# cp s1/s1.ibd t1/ 设置权限,很重要,如果权限不一致会导致数据读取表空间数据失败 [root@dxd mysql]# chown -R mysql.mysql t1/
  5. 将原有数据表解锁。 mysql> use s1; Database changed mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)
  6. 载入新的表空间。 mysql> use t1; mysql> alter table s1 import tablespace; Query OK, 0 rows affected (0.09 sec)
  7. 测试。 mysql> select count( ) from s1; +—————+ | count( ) | +—————+ | 55202 | +—————+ 1 row in set (0.03 sec)

我们看到此时就实现了数据迁移。

这种数据迁移虽然性能很好,但是过程非常麻烦,很容易出现操作失误的情况。

总结

今天,我们介绍了三种数据库迁移的方式,分别是:逻辑迁移、文件迁移和物理迁移。

逻辑迁移的方式主要是使用 mysqldump 命令进行迁移,其原理主要是将数据库中的数据和结构生成 SQL 文件,再导入即可。这种迁移方式主要适用于数据量比较小且服务器性能较好的场景下,例如数据连少于 500 万条以下的场景。

文件迁移的方式其实也算是逻辑迁移的范畴,它主要通过命令将数据保存在文件中,然后再导入数据库即可,这种迁移方式是不会迁移表结构的,所以在导入数据之前需要手动创建表结构,其原理跟逻辑迁移的方式相同。

物理迁移的方式适用于数据量比较大的场景,这种场景不易导致服务器因资源占用过多而宕机,但是操作过程麻烦且会锁定原数据表。

在实际应用过程中,我们通常选择使用 mysqldump 的方式进行数据迁移;如果数据量大,我们首选方式应该是提升服务器的性能,以至于它能够承载处理相应数据量的性能;如果必须迁移,可以考虑使用第三方专业的数据迁移工具。

本文转载于网络 如有侵权请联系删除

相关文章

  • 送花送包送红包,不如用JS送给Ta一个VR世界

    抱歉今天来晚了,本应该白天发才对,发生了一点点小插曲~先上图感受一下,以梦幻城堡-迪士尼为例(gif觉得卡顿可以看视频)。http://mpvideo.qpic.cn/0bf2huab4aaayqadtirjwbqfapoddy6qahqa.f10002.mp4?dis_k=4dd4fd8bd805d7455fb973c4bdffcf08&dis_t=1615431339&spec_id=MzkyOTIxMDAzNw%3D%3D1615431340&vid=wxv_1740093831359856641&format_id=10002http://mpvideo.qpic.cn/0bf2vaab2aaa2madtqrjxjqfbkgddwuaahia.f10002.mp4?dis_k=c9f8798b7b7d36a003b89e91c3fbdd3d&dis_t=1615431340&spec_id=MzkyOTIxMDAzNw%3D%3D1615431340&vid=wxv_1740078835867418626&form

  • mybatis插件拦截原理学习

    mybatis中,我们知道如果需要对分页或者排序进行增强时,可以采用拦截来实现增强,那它的增强原理又是怎样的呢?做拦截操作:执行插件包装方法(重要)。可以看到它里面有三个参数是我们需要关注的,一个是签名方法是通过拦截器拿到的,一个是目标方法的字节码对象,一个是接口列表,接口列表是代理的主要对象,采用动态代理,因此这里做了一个判断,判断接口列表的长度是否大于0,如果大于0,则执行动态代理,可以看到代理过程是在Plugin类中的,同时可以看到此时必然会有一个invoke方法执行动态代理,实现拦截增强。执行拦截增强的前提是有方法可以拦截,因此此时会判断method是否为空,或者是否包含增强方法,如果有,则执行interceptor的intercept方法,否者执行method.invoke方法。可以看到签名map可以有多个method,因为其具有的签名方法有一对多或者一对一的方式,同时接口是一个列表,而目标字节码为type。我们还是按照原来的方式,在mybatis的test中找到pluginTest这个测试方法:classPluginTest{ @Test voidmapPluginSho

  • 火爆外网的 DGS 框架使用

    Netflix已开放其DomainGraphService(DGS)框架的源代码,该框架是为了方便整合GraphQL使用,用于简化GraphQL的实现。GraphQL主要是作用于数据接口,比如前端后端交互。无需定义或修改后台Controller、Service等业务代码即可实现灵活的数据变更,客户端可以自由获取服务端事先定义好的数据,提高了交互接口的灵活性组件依赖graphql-dgs-spring-boot-starter<dependency> <groupId>com.netflix.graphql.dgs</groupId> <artifactId>graphql-dgs-spring-boot-starter</artifactId> <version>3.5.1</version> </dependency>复制DGS必须从jcenter下载,不然部分依赖无法下载。踩坑很久 <profiles> <profile> <activation&

  • 使用Angular的http client发送请求,请求response总是被当成json类型处理

    奇怪的问题,我的req.responseType字段没有显式赋值,而默认值为json:这个默认值是在哪里填充的呢? 调试代码,http.js的第1669行有这个默认的逻辑:解决方案:下图第26行responseType:'text'as'json'复制import{Component,OnInit}from'@angular/core'; import{FormControl}from'@angular/forms'; import{HttpClient,HttpHeaders}from'@angular/common/http'; import{Observable}from'rxjs'; constENDPOINT="http://localhost:3000/echo?data="; @Component({ selector:'jerryform', template:` <inputtype="te

  • 帅心涛/沈君Small:氧化还原响应MOF纳米粒诱导铁死亡的癌症治疗

    铁死亡在肿瘤治疗中的有效性引起了极大的关注。在肿瘤部位产生毒性脂质过氧化物(LPO)的效率在铁死亡中起关键作用。中山大学帅心涛、沈君合成了杂化的PFP@Fe/Cu-SS金属有机骨架(MOF),并显示可通过产生·OH的氧化还原反应增加肿瘤内LPO含量。此外,通过二硫键-硫醇交换消耗的谷胱甘肽(GSH)导致谷胱甘肽过氧化物4(GPX4)失活,从而引起LPO含量进一步增加。 该MOF对小鼠中异位移植的Huh-7肿瘤的生长表现出高抑制作用。并用铁凋亡抑制剂会降低MOF的抗肿瘤作用,从而恢复GPX4活性并增加肿瘤生长。而且,PFP@Fe/Cu-SS不仅使MOF可以用作T1磁共振成像的造影剂,还可以提高其光热转换能力。因此,近红外辐射能够诱导光热疗法并将封装的液态全氟戊烷转化为微泡,以进行超声成像。本文成功地合成了PFP@Fe/Cu-SSMOF来诱导肿瘤铁死亡。由于LPO的水平与铁死亡有关,因此MOF可以作为有效的铁死亡诱导剂,因为它通过Fenton反应增加了LPO的产生,从而使内源性H2O2产生·OH,同时抑制了GPX4的活性,防止了有毒LPO通过二硫化物转化为无毒LOH,与GSH进行硫醇交换。

  • 大数据开发:看了都说好的JVM分析

    一.什么是JVMJVM它是JavaVirtualMachine的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的,组成部分包括堆、方法区、栈、本地方法栈、程序计算器等部分组成的,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。Java能够被称为“一次编译,到处运行”的原因就是Java屏蔽了很多的操作系统平台相关信息,使得Java只需要生成在JVM虚拟机运行的目标代码也就是所说的字节码,就可以在多种平台运行。二.关于JVM的总体概述JVM总体上是由类装载子系统(ClassLoader)、运行时数据区、执行引擎、垃圾收集这四个部分组成。其中我们最为关注的运行时数据区,也就是JVM的内存部分则是由方法区(MethodArea)、JAVA堆(JavaHeap)、虚拟机栈(JVMStack)、程序计数器、本地方法栈(NativeMethodStack)这几部分组成。三.关于JVM的体系结构1.类装载子系统ClassLoader类加载器负责加载.class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文

  • 容器化配置生成神器

    Derrick简介Derrick是一个可以帮助开发者快速完成应用容器化的工具。Derrick主要关注的是希望容器化的开发者如何在本地进行开发的问题。开发者可以通过使用Derrick加速本地应用容器化迁移的过程。Derrick自动生成以下配置Dockerfile.dockerignoredocker-compose.ymlJenkinsfilekubernetes-deployment.yaml安装指南依赖:Docker(17.06~)Python2.7~python3.6docker-composeminikubeinlocalDerrick安装:#安装derrick $pipinstallpython-derrick #报fatalerror:Python.h:Nosuchfileordirectory错误,请安装下面包(CentOS例子) $yuminstall-ypython-devel复制Derrick支持运行平台Linuxmacwindows演示#下载derrick-nodejs-demonode项目 $gitclonehttps://github.com/ringtail

  • 盒子端 CSS 动画性能提升研究

    不同于传统的PCWeb或者是移动WEB,在客厅盒子端,接大屏显示器下,许多能流畅运行于PC端、移动端的Web动画,受限于硬件水平,在盒子端的表现的往往不尽如人意。基于此,对于Web动画的性能问题,仅仅停留在感觉已经优化的OK之上,是不够的,想要在盒子端跑出高性能接近60FPS的流畅动画,就必须要刨根问底,深挖每一处可以提升的方法。流畅动画的标准理论上说,FPS越高,动画会越流畅,目前大多数设备的屏幕刷新率为60次/秒,所以通常来讲FPS为60frame/s时动画效果最好,也就是每帧的消耗时间为16.67ms。直观感受,不同帧率的体验帧率能够达到50~60FPS的动画将会相当流畅,让人倍感舒适;帧率在30~50FPS之间的动画,因各人敏感程度不同,舒适度因人而异;帧率在30FPS以下的动画,让人感觉到明显的卡顿和不适感;帧率波动很大的动画,亦会使人感觉到卡顿。盒子端动画优化在客厅盒子端,Web动画未进行优化之前,一些复杂动画的帧率仅有10~30FPS,卡顿感非常明显,带来很不好的用户体验。而进行优化之后,能将10~30FPS的动画优化至30~60FPS,虽然不算优化到最完美,但是当前盒子

  • 有了这些新功能,再也不担心安全问题!

    这是一个简短的推送,就是为了告诉各位管理员们~乐享开放了信息安全的功能啊啊啊啊啊啊! 那么,信息安全包括什么呢? 1分享限制开启限制后,非管理员无法分享内容到第一级组织架构。不少管理员担心员工误操作,导致乐享内容分享到全员,骚扰到其他同事。针对这一点,分享限制开启后,普通员工只能分享到组织架构的第二级人员,大大减小了这方面的问题。2水印设置选择了水印设置的应用,会在内容展示页面增加姓名水印,乐享默认开启文档、乐问的水印设置。不少公司在乐享上存放公司的专属信息,员工如果有意无意截屏外泄怎么办?水印功能很好的解决了这一问题。开启水印功能,可以有效地提醒员工,该内容含水印,属于公司内部信息,加强员工对信息安全的敏感度,降低信息泄露的可能。3下载管理下载管理将记录每日超过10次的异常下载数据。乐享上的分享内容支持常用文档格式的在线预览,出于信息安全考虑,同事们一般在线查看就好了,但也不排除有需要下载来看,但是如果有人大量下载文档,就需要管理员们关注一下了。乐享的超量下载预警功能就可以避免这个问题,通过下载管理,记录每天超过10次的异常下载,并可以查看对应的下载内容。 最后,要设置信息安全,请管

  • 我带着你,你带着它,春节一起去「私奔」吧

    作者:赵兴源随着日历已经撕到了2018年,春节的脚步也就不远了。辛苦了一年,你是否也想要给自己放个假,出去走走?今天,知晓程序(微信号zxcx0101)向你推荐的这个小程序就来做你的旅游贴身小秘书,帮你轻松规划每一次完美旅行。关注「知晓程序」公众号,微信后台回复「0109」,一张图教你玩转小程序。「携程旅游攻略」是携程推出的一款帮助你制定旅行计划、查看景点信息及游玩建议等的小程序。其界面美观又实用,无论你是喜欢出行前做详细规划还是偏向不做计划、说走就走的人,都非常值得一试。遇见「携程旅游攻略」小程序当我初次打开「携程旅游攻略」小程序,我的想法是:它的首页好简洁,但同时又好美。如果你的心中已经有了明确的目的地,直接在搜索框中输入它就好了。如果没有,「携程旅游攻略」小程序则会根据当下热门,自动向你推荐6个适合去的目的地。同时,首页也会记录你的浏览记录,如果一次无法完成整个规划,下次你可以直接点击历史记录,就可以快速跳转进来了。值得一提的是,「携程旅游攻略」小程序支持国内和国际的旅游地,无论你想国内游或是出境游,都可以使用。制定你的旅行计划确定目的地后,「携程旅游攻略」小程序将会向你介绍这个

  • 自定义控件详解(七):drawText()

    比较基础的一个方法。即绘制文本使用如下:Paintpaint=newPaint(); paint.setColor(Color.RED);//红色字体 paint.setStyle(Paint.Style.FILL);//类型 paint.setStrokeWidth(1);//画笔线条宽度 paint.setTextSize(60);//绘制文本大小 //绘制内容 canvas.drawText("听着music睡'blogs",100,200,paint);复制效果; 可以看下方法: 这篇只讨论第三个方法。 可以看到4个参数,第二个、第三个参数是float类型,实际上就是绘制的文本的绘制参考坐标。注意这个坐标不是文本的左上角的那个点,floaty代表基线的Y位置。 验证一下: 绘制一条蓝色的基线,绘制一个文本。Paintpaint=newPaint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(1); paint.setTe

  • 什么能够改变未来零售行业?微软:HoloLens全息技术

    本文共978字,看完全文约需2分钟提及AR眼镜,很多人会不约而同想到HoloLens,其所带来的体验感并不是当前其他AR眼镜所能比拟的。与其体验感成正比的是它的价格,开发者版23488元,商业套装39188元,也是常人所承担不起的,因此目前HoloLens还是主打商业,希望能将全息图打造成为商业主流。微软新设备主管LeilaMartine表示:“第一次见到这项技术时,我就被它所吸引,决定这一生都要跟这项技术打交道。早期,微软的策略是专注AR而非VR,帮助人们与增强的现实世界进行交互。这就意味着未来零售商将有一个平台让他们从事之前从未做过的事,就像拥有了超能力那般。”据悉,Martine于2001年加入微软,并在2014年首次接触到HoloLens。微软在2015年1月,正式公布HoloLens开发者版。Martine说:“我仍记得当初HoloLens发布时,在市场上引起的轰动有多大。一开始HoloLens定价为3000美元,非常昂贵。但对于零售商和企业来说,HoloLens将赋予其产品新的活力,因此他们对HoloLens非常感兴趣,并希望得到更多的商业功能。”为了满足用户的需求,微软在

  • 危险漫步利用图片链接完成注入渗透

    利用图片链接完成注入渗透 最近危险漫步闲着无聊就访问外国网站去国外看了一看黑客新闻,有一条新闻引起了我的关注,那就是国外某黑客黑了Word文档,导致了一家公司损失了数千万美金,整个事件我就不多说了,大家可以去去谷歌查看。 这次危险漫步要和大家讲的就是黑客与Word之间的故事。 Word经常被黑客利用来做一些黑产,这个事情我是知道的,但是我一直没有当回事我觉得这些都是小打小闹,可是当我自己真的开始实际操作的时候却发现,原来这里面真的是别有洞天啊~~ 打一个简单的比方就是,在进行Web应用渗透测试的时候,Word文档极有可能被用于抓取NetNTLM哈希或用来证明网络出口过滤不严等等一系列的问题。 OK,现在步入正题,进入我们今天的主题,利用图片链接完成注入渗透 这次我打算用直播的方式来和大家播报一下我这次的渗透注入之旅。 第一步,我们需要打开菜单栏上的“插入”选项卡并单击“图片”图标。这个时候会弹出资源管理器窗口。在文件名字段中输入一共恶意URL,并点击“插入”下拉菜单选择“链接到文件”。这样就成功插入了一个burpcollaborator的链接。 为了提高这个恶意URL

  • MYSQL GTID使用运维介绍

    GTID定义:定义:GTID即全局事务ID(globaltransactionidentifier),一个事物对应一个GTID引入:MySQL-5.6.5开始支持,MySQL-5.6.10后开始完善组成:GTID=server_uuid:transaction_idserver_uuid首次启动时MySQL会自动生成一个server_uuid,并且保存到auto.cnf文件,一个实例对应一个server_uuidtransaction_id从1开始的自增计数,表示在这个主库上执行的第n个事务开启GTID:[mysqld]#GTIDgtid_mode=on开启GTIDenforce-gtid-consistency=on启用强一致性检查,避免createtable...select操作log-slave-updates=1允许下端接入slave#binloglog-bin=mysql-bin开启binlogbinlog_format=rowbinlog格式为row模式GTID优缺点:优点:slave在做同步复制时,无须找到binlog日志和POS点,直接changemastertomas

  • iconfont字体图标库

    HTML5学堂小编的话:昨日发布的iconfont的内容有些不足,对于可能不太了解iconfont和特殊字体的学习者来说,可能会存在一定的理解问题,在此针对昨日内容进行补充,详细讲解。字体相关知识 了解iconfont(字体图标)前我们先了解下字体,因为iconfont的实现与字体息息相关,所以掌握字体相关知识便于理解iconfont。接下来看一个简单的例子<!doctypehtml> <html> <head> <metacharset="UTF-8"> <title>HTML5Course-梦幻雪冰</title> <linkrel="stylesheet"href="reset.css"> <scripttype="text/javascript"src="jquery-1.8.3.min.js"></script> <style> .font-demop:nth

  • 几行python代码轻松实现SAP自动登录

      小爬之前的博文【使用Python完成SAP客户端的打开和系统登陆】中已经提到了一种自动登录SAP的思路,该博文的评论区也有好心的网友ken-yu提供了另一种思路来做到这一点,代码如下: importsubprocess #'-system=PRD'请把PRD换成指定SAP系统的SID #'-client=110'请把Client修改为正确的Client,输入用户名和密码的上方有的Client,3位数字的 #'-l=ZH'ZH中文,EN英文, deflogin() login_info=['C:\\ProgramFiles(x86)\\SAP\\FrontEnd\\SAPgui\\sapshcut.exe','-system=PRD','-client=110','-l=ZH','-user=用户名','-pw=密码'] subprocess.check_call(login_info) login() # # # #主要是调用sapshcut.exe,SAPGUI740,750,760都有这个sapshcut.exe程序,通过查看sapshcut.exe这个程序的帮助能得到更

  • 初识vue——起步

    一、目录结构: 我们经常使用的是以下几个目录: 1、assets:静态资产文件:在vue组件中,所有组件中,所有模板和CSS都会被vue-html-loader和css-loader解析,并查找资源url。例如<imgsrc='./logo.png'>和background:url(./logo.png)中,都是相对路径,将由webpack解析为模块依赖;这些资源可能在构建过程中被内联,复制,重命名,基本上是源码的一部分,主要存放图片等内容;其实自己创建文件夹放置静态资源都是可以的; 与其相似的是一个名为static文件夹,static/目录下的文件并不会被webpack处理;他们会直接被复制到最终目录。要使用绝对路径引用这些文件; 2、components文件:存放我们开发的内容;  Test.vue 这些都不是固定的,自己可以按照项目需求建立自己的目录来存放文件; 3、router文件:   而我们所有components文件下的.vue文件都会被加载到APP.vue文件里面,然后加载到index.html里面;  

  • 六、访问权限控制

    一、使用import导入类,若要导入其中的类,需要使用*   Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR)的.class文件,Java解释器负责这些文件的查找,装载和解释。   Java解释器的运行过程:首先找出环境变量classpath,classpath包含一个或多个目录,用作查找.class文件的根目录。从根目录开始,解释器获取包的名称并且将每个句点替换成反斜杠,以从classpath根中产生一个路径名称。解释器从这些目录中查找与你所要创建的类名称相关的.class文件。   二、使用import改变行为   Java没有条件编译功能,但是可以通过修改被导入的package的方式来实现这一目的,修改的方法是将你程序中用到的代码从调试版改为发布版,这一技术可以适用于任何种类的条件代码。   三、通过提供访问器和变异器的方法(get/set),以读取和改变数值,对OOP语言来说,这是最优雅的方法,也是Javabeans的基本原理。   四、如果创建了一个新包,并自另一个包中继承类,那么唯一可以访问的成员就是源包的public成员

  • The entity type &#39;Vehicle&#39; cannot be configured as owned because it has already been configured as a non-owned.

    System.InvalidOperationException:Theentitytype'Vehicle'cannotbeconfiguredasownedbecauseithasalreadybeenconfiguredasanon-owned.Ifyouwanttooverridepreviousconfigurationfirstremovetheentitytypefromthemodelbycalling'Ignore'.      System.InvalidOperationException:Thenavigation'VehicleType.Vehicles'isnotsupportedbecauseitispointingtoanownedentitytype'Vehicle'.Onlytheownershipnavigationfromtheentitytype'VehicleOwnership'canpointtotheownedentitytype.Seehttps://aka.ms/efcore-docs-ownedform

  • 关于opencv动态库的调用

      release版的程序必须调用release版的opencv lib, debug版的程序必须调用debug版的opencv lib, 否则,opencv里imread等函数会运行出错 最近用opencv2.2以上版本,尝试采用C++风格来编程。 发现最简单的 imread, imshow 都出错了。 最后发现问题。 release版的程序必须调用release版的opencv lib, opencv_core242.lib opencv_legacy242.lib opencv_highgui242.lib opencv_features2d242.lib opencv_flann242.lib opencv_calib3d242.lib opencv_imgproc242.lib opencv_video242.lib   debug版的程序必须调用debug版的opencv lib, opencv_core242d.lib opencv_legacy242d.lib opencv_h

  • 黑马程序员_Java基础:多线程总结

    一、多线程的概念   进程和线程经常会被人混淆,那是因为对它们的概念不明确。就拿我们平时使用的操作系统来说,它是多任务的操作系统,而多线程就是实现多任务的一种方式。  进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。   线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如平时下载的软件迅雷进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。   说起多线程,给很多人得印象就是“同时”执行。但是多线程在并发执行的时候,其实是在线程之间快速轮换执行的,只不过轮换的速度很快,所以有“同时”执行的效果。   二、多线程的优缺点   优点:  (1)资料利用率更好。  (2)部分程序设计更加简单。  (3)程序响应更快。  (4)简化异步时间的处理(服务器)。   缺点:  (1)部分程序设计更复杂。  (2)增加cpu上下文切换开销。  (3)增加资源消耗。   三、多线程的创建和使用   在java中提供了对

相关推荐

推荐阅读