MySQL 5.6 的新特性之一,是加入了全局事务 ID (Global Transaction ID) 来强化数据库的主备一致性,故障恢复,以及容错能力。官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在这篇文档里,我们可以知道GTID(全局事务 ID) 的官方定义是:GTID实际上是由UUID+TID组成的,其中UUID是一个MySQL实例的唯一标识,TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。

那么基于GTID的Replication有啥好处?好处主要有以下2点:

1)在传统的复制里面,当发生故障,需要主从切换,需要找到binlog和pos点,然后change master to指向新的master,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道master的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。

(2)多线程复制(基于库)。在MySQL 5.6以前的版本,slave的复制是单线程的。一个事件一个事件的读取应用。而master是并发写入的,所以延时是避免不了的。唯一有效的方法是把多个库放在多台slave,这样又有点浪费服务器。在MySQL 5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制,当只有1个库,多线程复制是没有用的。

GTID的工作原理:

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。

下面我们说下基于GTID复制的搭建(当MySQL5.6的版本安装好后,在数据目录下有一个auto.cnf的文件,就是存放着server-uuid):

查看GTID的相关的一些变量:

root@xuanzhi (master)>show variables like '%gtid%';
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| enforce_gtid_consistency | OFF |
| gtid_executed | |
| gtid_mode | OFF |
| gtid_next | AUTOMATIC |
| gtid_owned | |
| gtid_purged | |
+--------------------------+-----------+
6 rows in set (0.00 sec) root@xuanzhi (master)>

可以看到,官方的MySQL5.6默认是没开启GTID的。

如果没有开启GTID选项,在binlog里,也看不到GTID的信息,以下binlog是没开启的Binlog日志信息:

[root@mysql-master ~]# /usr/local/mysql-3306/bin/mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS /home/mysql-3306/data/mysql-bin.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#150628 18:02:33 server id 1 end_log_pos 120 CRC32 0x42bbbf2b Start: binlog v 4, server v 5.6.10-log created 150628 18:02:33
# Warning: this binlog is either in use or was not closed properly.
# at 120
#150628 18:02:50 server id 1 end_log_pos 242 CRC32 0x693a437d Query thread_id=2 exec_time=0 error_code=0
use `xuanzhi`/*!*/;
SET TIMESTAMP=1435485770/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
DROP TABLE `tb1` /* generated by server */
/*!*/;
# at 242
#150628 18:03:04 server id 1 end_log_pos 442 CRC32 0x8147c0f8 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1435485784/*!*/;
CREATE TABLE `tb1` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*!*/;
# at 442
#150628 18:03:19 server id 1 end_log_pos 517 CRC32 0xac178240 Query thread_id=2 exec_time=0 error_code=0

在master的my.cnf添加以下选择开启GTID:

binlog_format = row
gtid-mode = ON
enforce-gtid-consistency = ON
log_bin=mysql-bin
log-slave-updates

其中binlog_format = row不是必须的,但是推荐使用ROW格式,具体的参考我前面的文章提到的原因,有些有很好奇为什么要设置log-slave-updates呢?嘻嘻,这个问题下面来揭晓,我们在不加log-slave-updates启动MySQL报以下错:

-- ::  [Note] InnoDB: 1.2. started; log sequence number
-- :: [ERROR] --gtid-mode=ON or UPGRADE_STEP_1 or UPGRADE_STEP_2 requires --log-bin and --log-slave-updates
-- :: [ERROR] Aborting

所以必须在配置文件添加上log-slave-updates才能正常启动。
我们查看下开启GTID后的Binlog信息如下:

[root@mysql-master mysql-]# /usr/local/mysql-/bin/mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS /home/mysql-/data/mysql-bin.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at
# :: server id end_log_pos CRC32 0xfde1a899 Start: binlog v , server v 5.6.-log created ::
# Warning: this binlog is either in use or was not closed properly.
# at
# :: server id end_log_pos CRC32 0xd0531b1e Previous-GTIDs
# [empty]
# at
# :: server id end_log_pos CRC32 0xb55c00a9 GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '62c879aa-1d73-11e5-8d91-2c768ad07874:1'/*!*/;
# at
# :: server id end_log_pos CRC32 0x1809848f Query thread_id= exec_time= error_code=
SET TIMESTAMP=/*!*/;
SET @@session.pseudo_thread_id=/*!*/;
SET @@session.foreign_key_checks=, @@session.sql_auto_is_null=, @@session.unique_checks=, @@session.autocommit=/*!*/;
SET @@session.sql_mode=/*!*/;
SET @@session.auto_increment_increment=, @@session.auto_increment_offset=/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=,@@session.collation_connection=,@@session.collation_server=/*!*/;
SET @@session.lc_time_names=/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at
# :: server id end_log_pos CRC32 0x97cc2ba2 Table_map: `xuanzhi`.`tb1` mapped to number
# at
# :: server id end_log_pos CRC32 0x1cfed777 Write_rows: table id flags: STMT_END_F
### INSERT INTO `xuanzhi`.`tb1`
### SET
### @=
### @='ee'
# at
# :: server id end_log_pos CRC32 0xff6c1187 Xid =
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@mysql-master mysql-]#

很明显的看到比之前多了一些信息,如下:

# :: server id   end_log_pos  CRC32 0xb55c00a9  GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '62c879aa-1d73-11e5-8d91-2c768ad07874:1'/*!*/;

小伙伴应该注意一个问题,当用低版本的mysqlbinlog命令去查看高版本的binlog日志会出现以下的错误,所以建议用对应版本的mysqlbinlog命令查看:

[root@mysql-master ~]# mysqlbinlog --no-defaults -v --base64-output=DECODE-ROWS /home/mysql-3306/data/mysql-bin.000003 > aa.sql
ERROR: Error in Log_event::read_log_event(): 'Sanity check failed', data_len: 43, event_type: 30
[root@mysql-master ~]#

二、开始搭建基于GTID的主从复制:

(1)在master上授权用来同步的用户:

root@xuanzhi (master)>grant replication slave on *.* to 'repl'@'192.168.100.143' identified by '';
Query OK, 0 rows affected (0.00 sec) root@xuanzhi (master)>flush privileges;
Query OK, 0 rows affected (0.00 sec) root@xuanzhi (master)>

(2)在master备份要同步的库,方法有很多,我用mysqldump来完成这动作:

[root@mysql-master ~]# mysqldump -uroot -p123456 -S /home/mysql-/mysql.sock --single-transaction --master-data= -q -A > ./all.sql
Warning: Using a password on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
[root@mysql-master ~]#

为了安全起见,我觉得应该在备份的时候关了GTID

[root@mysql-master ~]# /usr/local/mysql-/bin/mysqldump -uroot -p123456 -S /home/mysql-/mysql.sock  --set-gtid-purged=OFF --single-transaction --master-data= -q -A > ./all.sql
Warning: Using a password on the command line interface can be insecure.
[root@mysql-master ~]# cat /home/mysql-/data/auto.cnf

(3)把数据拷贝到slave服务器上:

[root@mysql-master ~]# scp all.sql 192.168.100.142:/root

(4)slave上也要开启GTID,所以在slave配置文件添加以下内容(注意server_id要跟Master不一样)

binlog_format = row
gtid-mode = ON
enforce-gtid-consistency = ON
log-bin=mysql-bin
log-slave-updates

(5)导入数据并执行change master操作:

[root@mysql-slave mysql-]# mysql -uroot -p123456 -S /home/mysql-/mysql.sock  < /root/all.sql

基于GTID复制的change master to要带上master_auto_position选项:

root@xuanzhi (slave)>change master to master_host='192.168.100.143',master_port=3306,master_user='repl',master_password='',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.53 sec) root@xuanzhi (slave)>show warnings;
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1759 | Sending passwords in plain text without SSL/TLS is extremely insecure. |
| Note | 1760 | Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives. |
+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

启动slave,又来警告了,我们查看下警告说了啥:

root@xuanzhi (slave)>start slave;
Query OK, 0 rows affected, 1 warning (0.20 sec) root@xuanzhi (slave)>show warnings;
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1753 | slave_transaction_retries is not supported in multi-threaded slave mode. In the event of a transient failure, the slave will not retry the transaction and will stop. |
+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

说选项slave_transaction_retries在多线程模式不支持。好吧,把它关了吧(我的版本是5.6.10,这版本可能在这方面可能存在问题,详细可以查看http://dev.mysql.com/doc/refman/5.6/en/start-slave.html

root@xuanzhi (slave)>stop slave;
Query OK, 0 rows affected (0.09 sec) root@xuanzhi (slave)>SET @@GLOBAL.slave_transaction_retries = 0;
Query OK, 0 rows affected (0.00 sec) root@xuanzhi (slave)>start slave;
Query OK, 0 rows affected (0.23 sec) root@xuanzhi (slave)>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.100.143
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 1058
Relay_Log_File: mysql-master-relay-bin.000007
Relay_Log_Pos: 408
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1058
Relay_Log_Space: 666
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 62c879aa-1d73-11e5-8d91-2c768ad07874
Master_Info_File: /home/mysql-3308/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set: 62c879aa-1d73-11e5-8d91-2c768ad07874:1-4,
f2ede1dc-1d73-11e5-8d95-2c768ad07874:1-124
Auto_Position: 1
1 row in set (0.00 sec) root@xuanzhi (slave)>

貌似5.6.19后的版本就在启动start slave的时候,就没那么警告了:

mysql> select version();
+------------+
| version() |
+------------+
| 5.6.25-log |
+------------+
1 row in set (0.00 sec) mysql> change master to master_host='192.168.100.143',master_port=3306,master_user='repl',master_password='',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.37 sec)

mysql> start slave;
Query OK, 0 rows affected (0.04 sec)

如果确定要使用5.6版本,尽可能使用靠后点的新版本!!!

三. GTID的局限性(或者说还不够完善的地方)

(1)有人说目前GTID还不支持MyISAM表(GTID是基于事务的),我测试过了是支持的:

root@xuanzhi (master)>show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec) root@xuanzhi (master)>insert into tb2 select 1,'aa';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 root@xuanzhi (master)>insert into tb2 select 2,'bb';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

在slave查看数据是否同步可以了

root@xuanzhi (slave)>show create table tb2\G
*************************** 1. row ***************************
Table: tb2
Create Table: CREATE TABLE `tb2` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec) root@xuanzhi (slave)>select * from tb2;
+------+------+
| id | name |
+------+------+
| 1 | aa |
| 2 | bb |
+------+------+
2 rows in set (0.00 sec) root@xuanzhi (slave)>

我们进行Binlog分析可以看到,是有GTID产生的

(2)对CREATE TABLE ..... SELECT语句不支持。

root@xuanzhi (master)>create table test select * from tb1;
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when ENFORCE_GTID_CONSISTENCY = 1.
root@xuanzhi (master)>

3)必须开启enforce-gtid-consistency参数,否则启动MySQL报错,如下所示:

20145-06-28 23:44:27 17563 [ERROR] --gtid-mode=ON or UPGRADE_STEP_1 requires --enforce-gtid-consistency
20145-06-28 23:44:27 17563 [ERROR] Aborting

四.  多线程复制(基于库,5.7很有可能实现基于表级别的多线程复制,值得期待)

多线程复制由参数slave-paralles-workers控制,设定从服务器的SQL线程数;0表示关闭多线程复制功能;默认为0,最大可以设置为1024个线程。在从库的配置文件[mysqld]段落添加配置:(一般有多少个库设置为多少)

slave_parallel_workers = 

此参数支持动态修改,灰常方便:

root@xuanzhi (slave)>set global slave_parallel_workers = 6;
Query OK, 0 rows affected (0.00 sec) root@xuanzhi (slave)>show processlist;
+----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+
| 36 | root | localhost | xuanzhi | Query | 0 | init | show processlist |
| 37 | system user | | NULL | Connect | 3839 | Waiting for master to send event | NULL |
| 38 | system user | | NULL | Connect | 2054 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |
| 39 | system user | | NULL | Connect | 3839 | Waiting for an event from Coordinator | NULL |
| 40 | system user | | NULL | Connect | 3839 | Waiting for an event from Coordinator | NULL |
| 41 | system user | | NULL | Connect | 3839 | Waiting for an event from Coordinator | NULL |
| 42 | system user | | NULL | Connect | 2054 | Waiting for an event from Coordinator | NULL |
| 43 | system user | | NULL | Connect | 2054 | Waiting for an event from Coordinator | NULL |
| 44 | system user | | NULL | Connect | 2054 | Waiting for an event from Coordinator | NULL |
| 45 | system user | | NULL | Connect | 2054 | Waiting for an event from Coordinator | NULL |
+----+-------------+-----------+---------+---------+------+-----------------------------------------------------------------------------+------------------+
7 rows in set (0.00 sec)

总结:

一、MySQL5.6相对MySQL5.5在功能和性能上都提升了不少,建议使用MySQL5.6的版本,如果要用5.6的版本,尽量使用靠后点的5.6的版本

     二、MySQL 5.6里面,不用再找binlog和pos点,我们只需要知道master的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步,相比之传统复制可用性更高,更合适一主多从架构

     三、我们尽可能的把一个库中的表按照业务逻辑拆分为多个库,这样在master上写操作时,slave就可以根据我们设置的线程数进行多线程复制,减少了传统复制的问题--延时。

http://www.cnblogs.com/abobo/p/4242417.html

http://www.cnblogs.com/gomysql/p/3816031.html

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

MySQL5.6 GTID Replication的更多相关文章

  1. MySQL5.6 GTID新特性实践

    MySQL5.6 GTID新特性实践 GTID简介 搭建 实验一:如果slave所需要事务对应的GTID在master上已经被purge了 实验二:忽略purged的部分,强行同步 本文将简单介绍基于 ...

  2. MySQL5.7 GTID 浅析

    https://yq.aliyun.com/articles/68441 摘要: # GTID 简介 GTID (global transaction identifier)在MySQL5.6时引入, ...

  3. MySQL5.7 GTID在线开启与关闭【转】

    当前场景   当前某些业务还有未开启GTID服务组,升级5.7后,如何检测是否符合开启GTID条件,如何在线修改切换使用GTID:已经升级5.7后,已经开启GTID,如何快速回滚后退: 线上gtid如 ...

  4. MySQL 5.6 GTID Replication【转】

    一. MySQL 5.6引入了GTID的概念,那么GTID是何方神圣?其实也不复杂,就是一个全局事务标示符.使用GTID时,每次事务提交都会在binlog里生成1个唯一的标示符,它由UUID和事务ID ...

  5. 阿里云ECS服务器上搭建keepalived+mha+mysql5.6+gtid+一主两从+脚本判断架构踩的坑

    最近,公司项目搭建了一套后端数据库架构,不是在RDS,是在阿里云的ECS服务器上搭建keepalived.mha.mysql5.6.gtid.一主两从架构,目前还没有实现读写分离,以后架构升级,可能代 ...

  6. MySQL5.6 GTID、多线程复制

    MySQL5.6新特性GTID.多线程复制 在Oracle发布MySQL5.6看到众多新特性之后很兴奋,包括对复制的改进.在MySQL5.5半同步复制之后MySQL5.6又引入GTID.多线程复制,在 ...

  7. How to create/restore a slave using GTID replication in MySQL 5.6

    MySQL 5.6 is GA! Now we have new things to play with and in my personal opinion the most interesting ...

  8. 基于GTID Replication主从数据不一致操作

    基本的M-S结构   现在master与slave主机数据一致:   mysql> select * from t1; +------+ | id   | +------+ |    1 | | ...

  9. MySQL5.7 GTID学习笔记

    GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理了G ...

随机推荐

  1. 数据结构(六)查找---多路查找树(B+树)

    前提 下图B树,我们要遍历它,假设每个节点都属于硬盘的不同页面,我们为了中序遍历所有的元素,页面2-页面1-页面3-页面1-页面4-页面1-页面5.而且我们每经过节点遍历时,都会对节点中的元素进行一次 ...

  2. CM记录-升级Spark版本到2.x(转载)

    ①csd包:http://archive.cloudera.com/spark2/csd/    下载SPARK2_ON_YARN-2.2.0.cloudera1.jar ②parcel包:http: ...

  3. golang变量声明

    func main() { var a1 int a1 = 1 var a = 1 b := 1 var c, d int c = 1 d = 1 var e, f = 1, 2 g, h := 1, ...

  4. typealias

    类的别名

  5. pd.qcut, pd.cut, df.groupby()等在分组和聚合方面的应用

    pd.qcut, pd.cut, df.groupby()等在分组和聚合方面的应用 量化交易里, 需要进行大量的分组和统计, 以方便自己处优势的位置/机会. 比如对股价进行趋势分析, 波动性分析, 量 ...

  6. Flask最强攻略 - 跟DragonFire学Flask - 第八篇 实例化Flask的参数 及 对app的配置

    Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...

  7. vue单页应用中 返回列表记住上次滚动位置、keep-alive缓存之后更新列表数据 那点事

    实践场景需求 产品列表中,滚动到一定位置的时候,点击查看产品信息,后退之后,需要回到原先的滚动位置,这是常见的需求 所有页面均在router-view中,暂时使用了keep-alive来缓存所有页面, ...

  8. mysql 架构 ~ binlog_server

    一 简介 mysql binlog server 二 目的 实时备份线上的binlog 利用备份+binlog进行任何时间点的恢复 三  详细信息    1 基本命令 /usr/local/mysql ...

  9. 创建Git独立分支

    在使用git进行版本控制的某些场景中我们可能需要在一个项目中建立完全独立的分支,此分支将作为一个独立的版本历史根节点,不与之前任何分支拥有相同的版本祖先. 比如当我们要在一个项目中使用一个分支进行项目 ...

  10. [转]GDB-----2.watchpoint

    TODO需要在ARM下验证 1. 前言 watchpoint,顾名思义,其一般用来观察某个变量/内存地址的状态(也可以是表达式),如可以监控该变量/内存值是否被程序读/写情况. 在gdb中可通过下面的 ...