当前位置: 首页 > 编程日记 > 正文

mysqldump和xtrabackup备份原理实现说明

MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异:

逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现。物理备份的特点是:拷贝相关数据文件。

这二种备份差异  :逻辑备份其备份、还原慢,但备份文件占用的空间小;物理备份其备份还原快,备份文件占用空间大。

到底选择那种备份方式,具体根据自己的实际情况,如需要的是热备还是冷备?数据量大不大?磁盘空间够不够等因素决定。

逻辑备份工具主要有:mysqldump、mysqlpump、mydumper,物理备份工具主要有:xtrabackup

现在使用最多的备份就是mysqldump、xtrabackup(都支持支持热备),本文就mysqldump(mysqlpump)和xtrabackup的原理进行下大致的说明。

逻辑备份:mysqldump,第三方备份工具mydumper的备份原理看MySQL备份mydumper的原理

1)参数说明,具体的参数可以用mysqldump --help查看。

在说明mysqldump之前先了解下它的相关参数,可以通过mysqldump --help进行查看,也可以通过mysqldump、mysqlpump备份工具说明和mysqldump的流程进行了解。这里再重申一下几个比较重要的参数。

①:--single-transaction

通过将导出操作封装在一个事务(Repeatable Read)内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作;其他引擎不能保证导出是一致的。当导出开启了–single-transaction选项时,要确保导出文件有效(正确的表数据和二进制日志位置),就要保证没有其他连接会执行如下语句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,这会导致一致性快照失效。这个选项开启后会自动关闭lock-tables。并且在mysql5.7.11之前,--default-parallelism大于1的时候和此参也互斥,必须使用--default-parallelism=0。5.7.11之后解决了--single-transaction和--default-parallelism的互斥问题。

②:--master-data

这个选项可以把binlog的位置和文件名添加到输出中,如果等于1,将会打印成一个CHANGE MASTER命令;如果等于2,会加上注释前缀。并且这个选项会自动打开–lock-all-tables,除非同时设置了–single-transaction(这种情况下,全局读锁只会在开始dump的时候加上一小段时间,不要忘了阅读–single-transaction的部分)。在任何情况下,所有日志中的操作都会发生在导出的准确时刻。这个选项会自动关闭–lock-tables。打开该参数需要有reload权限,并且服务器开启binlog。

③:--lock-all-tables ,-x

锁定所有库中所有的表。这是通过在整个dump的过程中持有全局读锁来实现的。会自动关闭–single-transaction 和 –lock-tables。

④:--lock-tables,-l

备份某个库就锁该库的所有表,用READ LOCAL来锁表。MyISAM允许并发写入,因为锁表只针对指定的数据库,不能保证物理上的一致性,不同库的表备份完成时会有不同的状态。用–skip-lock-tables来关闭。

⑤:--flush-logs,-F

在开始导出前刷新服务器的日志文件。注意,如果你一次性导出很多数据库(使用--databases= 或--all-databases 选项),导出每个库时都会触发日志刷新。例外是当使用了--lock-all-tables、--master-data或--single-transaction时:日志只会被刷新一次,那个时候所有表都会被锁住。所以如果你希望你的导出和日志刷新发生在同一个确定的时刻,你需要使用--lock-all-tables、--master-data和--single-transaction配合 –flush-logs。

⑥:--opt

该参数默认开启,表示快递启动--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset选项,通过 --skip-opt 关闭。

2)执行说明

①:逻辑备份就是导出SQL形式的文件,其的具体实现步骤可以直接打开genaral_log。

general_log_file        = /var/log/mysql/mysql.log
general_log             = 1

②:备份需要保证数据库的一致性,即在某一时刻,整个数据库的状态是一致的,这样可以通过备份进行恢复成为另一个从库。数据库目前使用最多的存储引擎是InnoDB,也有可能部分是MyISAM,建议把MyISAM存储引起改成InnoDB。现在重点说明关于InnoDB的备份。

MyISAM表的备份选项:上面提过因为mysqldump默认开启--opt选项,而--opt里包含--lock-tables的选项,这个选项不能保证在多个数据库下数据备份的一致性,所以要么--skip-opt,再把需要的选项添加进去,要么就再使用--lock-all-tables的选项(开启之后会关闭--lock-tables的选项),要是在从库备份则只需要添加--master-data选项(开启之后自动打开--lock-all-tables选项)即可。

备份myisam表的命令:

mysqldump -uroot -p123 --default-character-set=utf8 --master-data=1 -R -E --triggers -B dba_test dba_test2 > /home/dxy/dba_test.sql

因为开启了--lock-all-tables选项(--master-data),保证一致性读和数据的一致性。在备份开始时就会执行FLUSH TABLES WITH READ LOCK命令,这个命令是server层面的锁,这样后面任何存储引擎执行DML、DDL语句都会 Waiting for global read lock状态,这样就保证了从备份点之后数据的一致性。

InnoDB表的备份选项:和上面介绍MyISAM表的备份选项一样,在此基础上增加了--single-transaction的选项,这个选项保证了通过将导出操作封装在一个事务(Repeatable Read)内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作,其他引擎不能保证导出是一致的。这个选项开启后会自动关闭--lock-tables选项,而--master-data选项自动打开–lock-all-tables选项,在设置了--single-transaction这种情况下,全局读锁只会在开始dump的时候加上一小段时间(5.7之前),5.7之后不需要加锁了

一致性快照,即一致性读取,那是如何保证一致性读的呢?具体的说明可以看MySQL 一致性读 深入研究这篇文章。大致的说明可以看下面的测试说明:

测试1: 

sesseion Asession B

mysql> set tx_isolation='repeatable-read';

Query OK, 0 rows affected (0.00 sec)

 

mysql> set tx_isolation='repeatable-read';

Query OK, 0 rows affected (0.00 sec)

 

mysql> begin;

Query OK, 0 rows affected (0.01 sec)



mysql> select * from t1;

Empty set (0.00 sec)

 

mysql> insert into t1(c1,c2) values(1,1);

Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;

+----+------+

| c1 | c2   |

+----+------+

|  1 |    1 |

+----+------+

1 row in set (0.00 sec)


结论1:RR隔离级别下的一致性读,不是以begin开始的时间点作为snapshot建立时间点,因为测试看出再begin一个事务的时候,表是没有数据的,sessionB写入数据之后,却能看到数据。

测试2:

session Asession B
mysql> set tx_isolation='repeatable-read';mysql> set tx_isolation='repeatable-read';

mysql> select * from t1;

Empty set (0.00 sec)

mysql> begin;

mysql> select * from t;



mysql> insert into t1(c1,c2) values(1,1);

Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;

Empty set (0.00 sec) 

结论2:RR隔离级别下的一致性读,是以第一条select语句的执行点作为snapshot建立的时间点的,即使是不同表的select语句。这里因为session A在insert之前对 t 表执行了select,所以建立了snapshot,所以后面的select * from t1 不能读取到insert的插入的值(snapshot的时候t1表没有数据)。 

测试3: 

session Asession B
mysql> set tx_isolation='repeatable-read';

mysql> set tx_isolation='repeatable-read';

mysql> select * from t1;

Empty set (0.00 sec)

mysql> begin;

mysql> select * from t1;

Empty set (0.00 sec)

mysql> select * from t1;

Empty set (0.00 sec)


mysql> insert into t1(c1,c2) values(1,1);

mysql> select * from t1;

Empty set (0.01 sec)


结论3:session A 的第一条语句,发生在session B的 insert语句提交之前,所以session A中的第二条select还是不能读取到数据。因为RR中的一致性读是以事务中第一个select语句执行的时间点作为snapshot建立的时间点的。而此时,session B的insert语句还没有执行,所以读取不到数据。

测试4:

session Asession B
mysql> set tx_isolation='repeatable-read';

mysql> set tx_isolation='repeatable-read';

mysql> select * from t1;

Empty set (0.00 sec)

mysql> select * from t1;

Empty set (0.00 sec)



mysql> insert into t1(c1,c2) values(1,1),(2,2);

mysql> select * from t1;

+----+------+

| c1 | c2   |

+----+------+

|  1 |    1 |

|  2 |    2 |

+----+------+

2 rows in set (0.01 sec)

mysql> select * from t1;

Empty set (0.00 sec)


mysql> update t1 set c2=100 where c1=1;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> select * from t1;

+----+------+

| c1 | c2   |

+----+------+

|  1 |  100 |

+----+------+

1 row in set (0.00 sec)


结论4:本事务中进行修改的数据,即使没有提交,在本事务中的后面也可以读取到。update 语句因为进行的是“当前读”,所以它可以修改成功。

通过上面的几个测试得出的结论:对同一个表或者不同表进行的第一次select语句建立了该事务中一致性读的snapshot,在snapshot建立之后提交的数据,一致性读就读不到,之前提交的数据就可以读到。事务一致性读的起始点其实是以执行的第一条语句为起始点的,而不是以begin作为事务的起始点的。

一般begin/start transaction是开始一个事务的标志,但不是事务开始的时间点,也就是说执行了start transaction之后的第一个语句(任何语句),事务才真正的开始。但是如果要达到将 start transaction作为事务开始的时间点,那么必须使用: 

START TRANSACTION WITH consistent snapshot    ###mysqldump中的快照就是用这个实现的

这样开启事务效果等价于: start transaction 之后,马上执行一条 select 语句(此时会建立一致性读的snapshot)。

测试5:

session Asession B
mysql> set tx_isolation='repeatable-read';mysql> set tx_isolation='repeatable-read';

mysql> select * from t1;

Empty set (0.01 sec)

mysql> start transaction;

mysql> insert into t1(c1,c2) values(1,1);

mysql> select * from t1;

+----+------+

| c1 | c2   |

+----+------+

|  1 |    1 |

+----+------+

1 row in set (0.00 sec)


测试6: 

mysql> set tx_isolation='repeatable-read';mysql> set tx_isolation='repeatable-read';

mysql> select * from t1;

Empty set (0.01 sec)

mysql> start transaction with consistent snapshot;

mysql> insert into t1(c1,c2) values(1,1);

mysql> select * from t1;

Empty set (0.00 sec)


上面测试说明了 start transaction 和 start tansaction with consistent snapshot的区别。测试5说明,start transaction执行之后,一致性读并没有开始,所以可以读到session B插入的值。测试6说明,start transaction with consistent snapshot已经开始了一致性快照,所以insert语句发生在事务开始之后,所以读不到insert的数据。

所以事务一致性快照开始时间点,分为两种情况

1)START TRANSACTION时,第一条语句的执行时间点,就是事务开始的时间点,第一条select语句建立一致性读的snapshot;

2)START TRANSACTION  WITH consistent snapshot时,则是立即建立本事务的一致性读snapshot,当然也开始事务了;

到此,大致说明了参数single-transaction的意义,其实就是通过start transaction with consistent snapshot实现一致性快照读:通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作,其他引擎(MyISAM)不能保证导出是一致的。如备份开启之后,通过一致性快照记录了mysql的binlog和position,此时往innodb表里写入数据,因为有一致性快照,备份读不到最新的记录,但是该操作会在之前记录binlog之后位置里记录,当还原的时候,直接应用之后的binlog记录即可。而myisam不支持事务,没有快照,备份直接取最新数据,而写入操作会持续记录到binlog里,所以还原的时候会导致一致性被破环。当还原到一个新从并开启同步的change(备份里面记录的点)之后,myisam表会出现主键冲突,而innodb表不会。

备份InnoDB表的命令:

mysqldump -uroot -p123 --default-character-set=utf8 --single-transaction --master-data=1 -R -E --triggers -B dba_test dba_test2 > /home/dxy/dba_test.sql

上面讲了这么多,现在通过general_log看看mysqlbinlog备份步骤

复制代码

2016-08-21T00:08:11.755486+08:00   15 Connect   root@localhost on  using Socket                         ##备份的连接方式2016-08-21T00:08:11.793153+08:00   15 Query     /*!40100 SET @@SQL_MODE='' */                           ##备份的SQL_MODE2016-08-21T00:08:11.815880+08:00   15 Query     /*!40103 SET TIME_ZONE='+00:00' */                      ##备份的时区,--tz-utc,用--skip-tz-utc关闭##2016-08-21T00:08:11.815880+08:00   15 Query     FLUSH /*!40101 LOCAL */ TABLES                        ##刷新表,5.6之前有,5.7没有##2016-08-21T00:08:11.815880+08:00   15 Query     FLUSH TABLES WITH READ LOCK                           ##加全局读锁,--lock-all-tables的作用。5.6之前有,5.7没有。5.7的mysqldump加了--single-transaction不需要锁表了?2016-08-21T00:08:11.815981+08:00   15 Query     SHOW STATUS LIKE 'binlog_snapshot_%'                    ##binlog的文件名和偏移量,--master-data的作用,5.6之前是用SHOW MASTER STATUS表示2016-08-21T00:08:11.822342+08:00   15 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ##--single-transaction的作用,设置成RR级别2016-08-21T00:08:11.822457+08:00   15 Query     START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */  ##--single-transaction的作用,设置成一致性快照读2016-08-21T00:08:11.822675+08:00   15 Query     SHOW VARIABLES LIKE 'gtid\_mode'2016-08-21T00:08:11.868728+08:00   15 Query     SHOW STATUS LIKE 'binlog_snapshot_%'                    ##binlog的文件名和偏移量,--master-data的作用,5.6之前是用SHOW MASTER STATUS表示2016-08-21T00:08:11.868940+08:00   15 Query     UNLOCK TABLES                                           ##解锁表,印证了全局读锁只会在开始dump的时候加上一小段时间(5.7之前),5.7之后不需要加锁了
#上面黄色背景表示备份前的一些准备工作:一致性快照、锁、二进制日志等信息。

2016
-08-21T00:08:11.900984+08:00   15 Query     SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dba_test','dba_test2'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE, EXTRA ORDER BY LOGFILE_GROUP_NAME2016-08-21T00:08:12.000013+08:00   15 Query     SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dba_test','dba_test2')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME2016-08-21T00:08:12.000954+08:00   15 Query     SHOW VARIABLES LIKE 'ndbinfo\_version'2016-08-21T00:08:12.001309+08:00   15 Init DB   dba_test2016-08-21T00:08:12.001387+08:00   15 Query     SHOW CREATE DATABASE IF NOT EXISTS `dba_test`2016-08-21T00:08:12.001505+08:00   15 Query     SAVEPOINT sp                                            ##--single-transaction的作用2016-08-21T00:08:12.001564+08:00   15 Query     show tables2016-08-21T00:08:12.001645+08:00   15 Query     show table status like 'abc'2016-08-21T00:08:12.001747+08:00   15 Query     SET SQL_QUOTE_SHOW_CREATE=12016-08-21T00:08:12.001772+08:00   15 Query     SET SESSION character_set_results = 'binary'2016-08-21T00:08:12.001799+08:00   15 Query     show create table `abc`2016-08-21T00:08:12.001835+08:00   15 Query     SET SESSION character_set_results = 'utf8'2016-08-21T00:08:12.001864+08:00   15 Query     show fields from `abc`2016-08-21T00:08:12.002013+08:00   15 Query     show fields from `abc`2016-08-21T00:08:12.002150+08:00   15 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `abc`            ##表示备份表的语句2016-08-21T00:08:12.021228+08:00   15 Query     SET SESSION character_set_results = 'binary'

#上面蓝色背景表示备份一张表的过程

2016-08-21T00:08:12.021499+08:00   15 Query     use `dba_test`2016-08-21T00:08:12.021549+08:00   15 Query     select @@collation_database2016-08-21T00:08:12.021616+08:00   15 Query     SHOW TRIGGERS LIKE 'abc'                                ##备份触发器,--triggers2016-08-21T00:08:12.039445+08:00   15 Query     SET SESSION character_set_results = 'utf8'2016-08-21T00:08:12.039561+08:00   15 Query     ROLLBACK TO SAVEPOINT sp ... ...2016-08-21T00:23:35.131333+08:00   16 Query     show events                                             ##备份事件,-E2016-08-21T00:23:35.161440+08:00   16 Query     use `dba_test`2016-08-21T00:23:35.161513+08:00   16 Query     select @@collation_database2016-08-21T00:23:35.161582+08:00   16 Query     SET SESSION character_set_results = 'binary'2016-08-21T00:23:35.161795+08:00   16 Query     SHOW FUNCTION STATUS WHERE Db = 'dba_test'              ##备份函数,-R2016-08-21T00:23:35.190912+08:00   16 Query     SHOW PROCEDURE STATUS WHERE Db = 'dba_test'             ##备份存储过程,-R2016-08-21T00:23:35.191683+08:00   16 Query     SET SESSION character_set_results = 'utf8'
2016-08-21T00:23:35.191683+08:00   16 Quit                                                             ##备份完成退出

复制代码

3)实现过程

通过2)里的general_log的这些步骤,可以看到mysqldump的大致实现过程是:连接 -> 初始化信息 -> 刷新表(锁表)-> 记录偏移量 -> 开启事务(一致性快照)-> 记录偏移量 -> 解锁表,因为开启了一致性读,可以得到innodb的一致性,又因为解锁表了,MyISAM表一致性得不到保证,所以尽量别使用MyISAM表。

本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1927046如需转载请自行联系原作者

sshpp

相关文章:

C语言100个经典的算法

POJ上做做ACM的题 语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月…

PornHub:修复百年前情色电影

全球最大不可描述网站 PornHub 最近在自己的官网上,注册了一个名为 「Remastured」的视频发布账号,中文意为「重制」。截止目前,这个账号已经上传了 21 个视频(包含一部项目介绍视频),共计两万的订阅用户和…

jquery 插件开发的作用域及基础

2019独角兽企业重金招聘Python工程师标准>>> 之前一直有开发jquery插件的冲动,所以一直想学习如何进行插件开发,最近一个项目需要使用图片上传组件及自动无限下拉组件,百度地图组件,所以趁着这次我就把他们全部插件化了…

WSUS Troubleshooting guide

Troubleshooting guide for issues where WSUS clients are not reporting in 来自于WSUS TEAM BLOG This guide is written to assist specifically in troubleshooting WSUS when clients are not reporting in. We will examine common troubleshooting considerations that…

在PHP语言中使用JSON

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。 一、json_encode() 该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子: $arr array (a>1,b>2,c&g…

【动态规划】最长公共子序列与最长公共子串

1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogsbelong比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列&#xff…

限量!“Java成长笔记”Spring Boot/Sentinel/Nacos高并发

前言本文是为了帮大家快速回顾了Java中知识点,这套面试手册涵盖了诸多Java技术栈的面试题和答案,相信可以帮助大家在最短的时间内用作面试复习,能达到事半功倍效果。本来想将文件上传到github上,但由于文件太大有的都无法显示所以…

时区切换导致quartz定时任务没有触发问题

时区切换对Quartz的cron表达式有影响,切换的1小时内停止触发定时任务,导致sla没有定时清空内存计数,误发限流。 美国夏令时PST切换到冬令时PDT,会有时间跳变。不带时区跳变的,会出现时间重叠或不连续 问题复现 mac本机…

C#之消息队列的简要说明

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Messaging ; using System.Threading ; namespace WinMsmq { /// <summary> /// Form1 的摘要说…

Arm收购进展、元宇宙、GPU涨价……听听黄仁勋怎么说

今年的台北国际电脑展 (Computex) 于 6 月 1-5 日在线上召开&#xff0c;期间 NVIDIA CEO 黄仁勋接受了媒体的线上群访&#xff0c;本文对采访内容进行了翻译与整理。对厨房情有独钟的黄教主&#xff0c;走出了厨房&#xff0c;选择了 NVIDIA 新办公大楼 Voyager&#xff08;旅…

要立刷金组flag了T_T

刷了那么多银组&#xff0c;发现自己好多不会啊... 果然太弱 在这感谢hzwer神犇的blog。。 大部分题解都从黄学长这里来orz。 orz。。。。 果然我太水

Centos7更改root密码

方法一#Step1&#xff1a;重启linux命令&#xff1a;rebootinit 6shutdown -r now#Step2&#xff1a;进grub改启动参数启动界面按“e”ro 改为rw init/sysroot/bin/shCtrlX保存做的更改&#xff0c;这时已经进入操作界面了#Step3&#xff1a;CtrlD然后init 6重启电脑&#xff0…

C#实现Des加密和解密

using System; using System.IO; using System.Security.Cryptography; namespace Vavic { /// <summary> /// Security 的摘要说明。 /// </summary> public class Security { const string KEY_64 "VavicApp"; const string IV_64 "V…

10 行代码玩转 NumPy!

作者 | 天元浪子来源 | Python作业辅导员NumPy也可以画图吗&#xff1f;当然&#xff01;NumPy不仅可以画&#xff0c;还可以画得更好、画得更快&#xff01;比如下面这幅画&#xff0c;只需要10行代码就可以画出来。若能整明白这10行代码&#xff0c;就意味着叩开了NumPy的大门…

秘钥加密码的登录模式

应用场景&#xff1a;有时候我们要给远在北京或者国外的开发人员服务器的权限&#xff0c;为了保证服务器的安全性我们不想让他们知道服务器的root登陆密码&#xff0c;所以我们可以给他们用秘钥加密码的登陆模式。原理&#xff1a;公钥加密 私钥解密。公钥和私钥是成对生成的&…

【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法

目录&#xff1a; 【C#小知识】C#中一些易混淆概念总结--------数据类型存储位置&#xff0c;方法调用&#xff0c;out和ref参数的使用 【C#小知识】C#中一些易混淆概念总结&#xff08;二&#xff09;--------构造函数&#xff0c;this关键字&#xff0c;部分类&#xff0c;枚…

关于C语言中的malloc和free函数的用法

一、malloc()和free()的基本概念以及基本用法&#xff1a; 1、函数原型及说明&#xff1a; void *malloc(long NumBytes)&#xff1a;该函数分配了NumBytes个字节&#xff0c;并返回了指向这块内存的指针。如果分配失败&#xff0c;则返回一个空指针&#xff08;NULL&#xff0…

爱购,你的最爱

这是个基于淘宝的购物软件,天天有特价转载于:https://www.cnblogs.com/ios1/p/3969797.html

「深度学习知识体系总结(2021版)」开放下载了!

随着世界技术的迭代与发展&#xff0c;人工智能和机器学习正在超自动化领域&#xff0c;扮演着越来越重要的角色。2020年的冠状病毒疫情突发&#xff0c;整个世界都在防疫的道路上披荆斩棘。人工智能发挥了重大作用&#xff0c;智能测温、智能消毒、智能建设都能看到AI的影子。…

自定义通知与系统通知的学习(详解)

因为有需求要做非系统通知&#xff0c;所以小马找个时间干脆一起学习了系统默认的通知与自定义通知的实现&#xff0c;吼吼&#xff0c;虽然简单&#xff0c;但开心呀&#xff0c;不多讲&#xff0c;老规矩&#xff0c;先看效果再来看代码&#xff1a; 一&#xff1a;应用刚启动…

Quick Cocos2dx 初步战斗

呵呵&#xff0c;图片先来一发&#xff1a; 最近懒&#xff0c;很懒&#xff0c;连我自己都觉得有点可耻了。 但是实在没有什么东西啊&#xff0c;温水煮青蛙的什么的。 吐槽完成&#xff0c;以上。 目前完成了简单的战斗部分&#xff0c;AI还需要抽出来。 然后突然之间想到手游…

C#简介- 类和对象

类&#xff08;class&#xff09;是C#类型中最基础的类型。类是一个数据结构&#xff0c;将状态&#xff08;字段&#xff09;和行为&#xff08;方法和其他函数成员&#xff09;组合在一个单元中。类提供了用于动态创建类实例的定义&#xff0c;也就是对象&#xff08;object&…

普诺飞思获创新工场新一轮投资,加速神经拟态视觉传感技术商业化

2021年7月6日&#xff0c;中国上海——世界领先的神经拟态视觉解决方案企业普诺飞思&#xff08;Prophesee&#xff09;今日宣布 C轮融资&#xff0c;由创新工场领投、小米及上海韦豪创芯跟投&#xff0c;数家老股东加码。其中&#xff0c;小米是全球三大移动设备供应商之一&am…

YYHS-魏传之长坂逆袭(梦回三国系列T1)

题目描述 众所周知&#xff0c;刘备在长坂坡上与他的一众将领各种开挂&#xff0c;硬生生从曹操手中逃了出去&#xff0c;随后与孙权一起火烧赤壁、占有荆益、成就霸业。而曹操则在赤壁一败后再起不能&#xff0c;终生无力南下。建安二十五年(220年)&#xff0c;曹操已到风烛残…

Linux中/proc目录下文件详解

Linux中/proc目录下文件详解&#xff08;一&#xff09;声明&#xff1a;可以自由转载本文&#xff0c;但请务必保留本文的完整性。作者&#xff1a;张子坚email:zhangzijian163.com说明&#xff1a;本文所涉及示例均在fedora core3下得到。 ---------------------------------…

Swift常量和变量

常量和变量由一个特定名称来表示&#xff0c;如maxNumber 或者 message。常量所指向的是一个特定类型的值&#xff0c; 如数字10或者字符”hello”。变量的值可以根据需要不断修改&#xff0c;而常量的值是不能够被二次修改的。 常量和变量的声明 常量和变量在使用前都需要声明…

Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货

作者 | 李秋键出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;人体姿态估计指从单个 RGB 图像中精确地估计出人体的位置以及检测骨骼关键点的位置。人体姿态估计是计算机视觉领域的研究热点&#xff0c;是诸多计算机视觉任务的基础&#xff0c;如动作分类、异常行为检…

主动防病毒内容篇

为何需要主动防病毒 近年来&#xff0c;对于防病毒软件效用的争论有愈演愈烈之势。我们知道&#xff0c;目前几乎所有的主流防病毒产品都是以分析病毒特征码为基础&#xff0c;通过升级安装在用户端的病毒特征码数据库实现对病毒的辨识。只有发现和确认了病毒之后&#xff0c;才…

icinga服务器系统监控软件的安装

系统环境rhel和Centos都可以安装这里我们所使用的安装包为中文版的icinga-cn-1.9.3.tar.bz2&#xff08;1&#xff09;安装icinga软件所支持的组件包&#xff08;我们这里采用yum源的方式&#xff09;组件&#xff1a;libdbi-dbd-mysql-0.8.3-5.1.el6.x86_64.rpmgd-devel-2.0.3…

size_t与ssize_t

size_t与ssize_t 为了增强程序的可移植性&#xff0c;便有了size_t&#xff0c;它是为了方便系统之间的移植而定义的&#xff0c;不同的系统上&#xff0c;定义size_t可能不一样。 l 在32位系统上定义为unsigned int &#xff0c;也就是说在32位系统上是32位无符号整形…