怎么reset mysql master,第1张

重置mysql主从同步(MySQL Reset Master-Slave Replication)

在mysql主从同步的过程中,可能会因为各种原因出现主库与从库不同步的情况,网上虽然有一些解决办法,但是有时很难彻底解决,重置主从服务器也许不是最快的办法,但却是最安全有效的。

下面将自己重置主从同步的步骤总结一下,以备不时之需。

master与slave均使用:centos60+mysql 5161 ,假设有db1,db2两个数据库需要热备。

文中shell与mysql均使用root账号,在真实环境中,请根据情况更换。

1停止slave服务器的主从同步

为了防止主从数据不同步,需要先停止slave上的同步服务。

STOP SLAVE;

2对master服务器的数据库加锁

为了避免在备份的时候对数据库进行更新操作,必须对数据库加锁。

FLUSH TABLES WITH READ LOCK;

如果是web服务器也可以关闭apache或nginx服务,效果也是一样的。

3备份master上的数据

mysqldump -u root -p -databases db1 db2 > baksql

4重置master服务

RESET MASTER;

这个是重置master的核心语法,看一下官方解释。

RESET MASTER removes all binary log files that are listed in the index file, leaving only a single, empty binary log file with a numeric suffix of 000001, whereas the numbering is not reset by PURGE BINARY LOGS

RESET MASTER is not intended to be used while any replication slaves are running The behavior of RESET MASTER when used while slaves are running is undefined (and thus unsupported), whereas PURGE BINARY LOGS may be safely used while replication slaves are running

大概的意思是RESET MASTER将删除所有的二进制日志,创建一个000001的空日志。RESET MASTER并不会影响SLAVE服务器上的工作状态,所以盲目的执行这个命令会导致slave找不到master的binlog,造成同步失败。

但是我们就是要重置同步,所以必须执行它。

5对master服务器的数据库解锁

UNLOCK TABLES;

如果你停止了apache或nginx,请开启它们

6将master上的备份文件拷贝到slave服务器上

大可不必用WinScp先下载到本地再上传到slave上,可以直接使用scp命令在服务器间拷贝,速度更快。

scp -r root@XXXXXXXXXXXX:/root/baksql /

7删除slave服务器上的旧数据

删除前,请先确认该备份的是否都备份了。

DROP DATABASE db1;

DROP DATABASE db2;

8导入数据

SOURCE /root/baksql;

9重置slave服务

RESET SLAVE;

还是看一下官方解释

RESET SLAVE makes the slave forget its replication position in the master's binary log This statement is meant to be used for a clean start: It deletes the masterinfo and relay-loginfo files, all the relay log files, and starts a new relay log file To use RESET SLAVE, the slave replication threads must be stopped (use STOP SLAVE if necessary)

大概意思是,RESET SLAVE将清除slave上的同步位置,删除所有旧的同步日志,使用新的日志重新开始,这正是我们想要的。需要注意的是,必须先停止slave服务(STOP SLAVE),我们已经在第一步停止了它。

10开启slave服务

START SLAVE;

大功告成,SHOW SLAVE STATUS\G 检查同步状态,一切正常。

一、Redis Client介绍

11、简介

Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各类API进行封装调用。

Jedis源码工程地址:https://githubcom/xetorthio/jedis

12、使用

Redis Client最好选用与服务端对应的版本,本例中使用Redis 2819客户端使用jedis -263,Maven工程添加如下引用即可。

<dependency>

<groupId>redisclients</groupId>

<artifactId>jedis</artifactId>

<version>263</version>

<type>jar</type>

<scope>compile</scope>

</dependency>13、注意事项

Redis Client拥有众多对接版本,本项目目前使用Jedis为官方推荐Java对接客户端,是基于其对Redis良好的版本支持和API对接,另外编码中尽量避免使用废弃接口。

Redis目前正在新版过渡期,30版本暂未稳定,但是由于30版本提供了最新的集群功能,可能在日后稳定版发布以后升级到30,目前使用的Jedis支持30的目前版本API。

二、Redis Client常用API

21、环境要求

语言:Java

JDK:17

Redis : 2819(稳定版)

22、系统使用

221、建立连接

普通连接

Jedis jedis = new Jedis("localhost");

jedisset("foo", "bar");

String value = jedisget("foo");

Systemoutprintln(value);设置连接池配置

该方法用于得到redis连接池连接使用的连接池配置,该连接池配置也可以通过spring注入的方式来进行相对应的配置,连接池采用的是平时比较常用的orgapachecommonspool2implGenericObjectPoolConfig来进行的连接池管理

配置文件如下

#redis服务器ip #

redisip=172305117

#redis服务器端口号#

redisport=6379

###jedis##pool##config###

#jedis的最大分配对象#

jedispoolmaxActive=1024

#jedis最大保存idel状态对象数 #

jedispoolmaxIdle=200

#jedis池没有对象返回时,最大等待时间 #

jedispoolmaxWait=1000

#jedis调用borrowObject方法时,是否进行有效检查#

jedispooltestOnBorrow=true

#jedis调用returnObject方法时,是否进行有效检查 #

jedispooltestOnReturn=true连接池配置实例化代码(也可通过spring注入进行配置):

/

获取化连接池配置

@return JedisPoolConfig

/

private JedisPoolConfig getPoolConfig(){

if(config == null){

config = new JedisPoolConfig();

//最大连接数

configsetMaxTotal(IntegervalueOf(getResourceBundle()getString("redispoolmaxTotal")));

//最大空闲连接数

configsetMaxIdle(IntegervalueOf(getResourceBundle()getString("redispoolmaxIdle")));

//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1

configsetMaxWaitMillis(LongvalueOf(getResourceBundle()getString("redispoolmaxWaitMillis")));

//在获取连接的时候检查有效性, 默认false

configsetTestOnBorrow(BooleanvalueOf(getResourceBundle()getString("redispooltestOnBorrow")));

//在获取返回结果的时候检查有效性, 默认false

configsetTestOnReturn(BooleanvalueOf(getResourceBundle()getString("redispooltestOnReturn")));

}

return config;

}普通连接池连接

这里展示的是普通的连接池方式链接redis的方案,跟普通的数据库连接池的操作方式类似;

/

初始化JedisPool

/

private void initJedisPool(){

if(pool == null){

//获取服务器IP地址

String ipStr = getResourceBundle()getString("redisip");

//获取服务器端口

int portStr = IntegervalueOf(getResourceBundle()

getString("redisport"));

//初始化连接池

pool = new JedisPool(getPoolConfig(), ipStr,portStr);

}

}Sentinel连接池连接

该连接池用于应对Redis的Sentinel的主从切换机制,能够正确在服务器宕机导致服务器切换时得到正确的服务器连接,当服务器采用该部署策略的时候推荐使用该连接池进行操作;

private void initJedisSentinelPool(){

if(sentinelpool == null){

//监听器列表

Set<String> sentinels = new HashSet<String>();

//监听器1

sentinelsadd(new HostAndPort("19216850236",

26379)toString());

//监听器2

sentinelsadd(new HostAndPort("19216850237",

26379)toString());

//实际使用的时候在properties里配置即可:redissentinelhostandports

=19216850236:26379,19216850237:26379

getResourceBundle()getString("redissentinelhostandports")

//mastername是服务器上的master的名字,在master服务器的sentinelconf中配置:

//[sentinel monitor server-1M 19216850236 6379 2]

//中间的server-1M即为这里的masterName

String masterName = getResourceBundle()

getString("redissentinelmasterName");

//初始化连接池

sentinelpool = new JedisSentinelPool(masterName,

sentinels, getPoolConfig());

}

}ShardedJedisPool连接池分片连接

/

初始化ShardedJedisPool

Redis在容灾处理方面可以通过服务器端配置Master-Slave模式来实现。

而在分布式集群方面目前只能通过客户端工具来实现一致性哈希分布存储,即key分片存储。

Redis可能会在30版本支持服务器端的分布存储

/

private void initShardedJedisPool() {

if (shardPool == null) {

// 创建多个redis共享服务

String redis1Ip = getResourceBundle()getString("redis1ip");

int redis1Port = IntegervalueOf(bundlegetString("redisport"));

JedisShardInfo jedisShardInfo1 = new JedisShardInfo(redis1Ip, redis1Port);

String redis2Ip = getResourceBundle()getString("redis2ip");

int redis2Port = IntegervalueOf(bundlegetString("redisport"));

JedisShardInfo jedisShardInfo2 = new JedisShardInfo(redis2Ip, redis2Port);

List<JedisShardInfo> serverlist = new LinkedList<JedisShardInfo>();

serverlistadd(jedisShardInfo1);

serverlistadd(jedisShardInfo2);

// 初始化连接池

shardPool = new ShardedJedisPool(getPoolConfig(),serverlist);

}

}读写删除操作

// 从池中获取一个Jedis对象

Jedis jedis = sentinelpoolgetSentinelpoolResource();

String keys = "name";

// 删除key-value对象,如果key不存在则忽略此操作

jedisdel(keys);

// 存数据

jedisset(keys, "snowolf");

// 判断key是否存在,不存在返回false存在返回true

jedisexists(keys);

// 取数据

String value = jedisget(keys);

// 释放对象池(30将抛弃该方法)

sentinelpoolreturnSentinelpoolResource(jedis);三、示例代码

1 String的简单追加

// 从池中获取一个Jedis对象

JedisUtilgetInstance()STRINGSappend(key, value);2 价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操作()

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

Set<Tuple> sumSet = JedisUtilExgetInstance()

getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);

//排序以后可以重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilExgetInstance()

getLastPirceUpAndTimeDownSet();3 价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操作

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

Set<Tuple> sumSet = JedisUtilExgetInstance()

getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);

//排序以后可以重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilExgetInstance()

getLastPirceDownAndTimeDownSet ();4 保存JavaBean到hash表中

// bean继承至RedisBean

JedisUtilExgetInstance()setBeanToHash(bean);5 从hash表中读取JavaBean

//uuid为业务制定的唯一标识符规则(相当于主键)

String uuid = “1”; //该ID是我们提前就知道的

//T继承至RedisBean;

JedisUtilExgetInstance()getBeanFromHash (uuid,Class<T> cls);6 将JavaBean列表装入hash中

//list中的bean继承至RedisBean

List<T> beanList = ;

JedisUtilExgetInstance()setBeanListToHash(beanList);

//异步版本的存储列表到hash

JedisUtilExgetInstance()setBeanListToHashSyn(beanList);7 普通的操作流程示例

//获取jedis引用

Jedis jedis = JedisUtilgetInstance()getJedis();

//执行业务以及调用jedis提供的接口功能

jedishset();

//执行完成以后务必释放资源

JedisUtilgetInstance()returnJedis(jedis);

//若以后不会使用JEDIS,需要关闭所有链接池

RedisConnetciondestroyAllPools();8 事务执行流程

//获取连接资源

Jedis jd = JedisUtilgetInstance()getJedis();

//开启事务

Transaction ts = jdmulti();

//执行业务以及调用jedis提供的接口功能

jedishset();

//执行事务

List<Object> list = tsexec();

//释放资源

JedisUtilgetInstance()returnJedis(jd);9 异步执行

//获取连接资源

Jedis jedis = JedisUtilgetInstance()getJedis();

//获取管道

Pipeline pipeline = jedispipelined();

//执行业务以及调用jedis提供的接口功能

jedishset();

//提交并释放管道

pipelinesyncAndReturnAll();

//释放资源

JedisUtilgetInstance()returnJedis(jedis);10 如何获取Jedis命名规则的合成KEY

//获取类的唯一键值key,例如:User:1(User为class,1为uuid)其中user继承于Reidsbean

JedisUtilExgetInstance()getBeanKey(user);

//另一种获取类的唯一键值key的方法

JedisUtilExgetInstance()getBeanKey(String uuid,Class<T> cls);

//获取bean对应的KEY(对应列的唯一键值key)

JedisUtilExgetInstance()getBeanKey(String uuid,Class<T> cls,String fileds);

//获取bean对应的KEY(集群key)

JedisUtilExgetInstance()getBeanKey(Class<T> cls,String fileds);四、jedis操作命令:

1对value操作的命令

exists(key):确认一个key是否存在

del(key):删除一个key

type(key):返回值的类型

keys(pattern):返回满足给定pattern的所有key

randomkey:随机返回key空间的一个key

rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

dbsize:返回当前数据库中key的数目

expire:设定一个key的活动时间(s)

ttl:获得一个key的活动时间

select(index):按索引查询

move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库

flushdb:删除当前选择数据库中的所有key

flushall:删除所有数据库中的所有key2对String操作的命令

set(key, value):给数据库中名称为key的string赋予值value

get(key):返回数据库中名称为key的string的value

getset(key, value):给名称为key的string赋予上一次的value

mget(key1, key2,, key N):返回库中多个string(它们的名称为key1,key2)的value

setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value

setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time

mset(key1, value1, key2, value2,key N, value N):同时给多个string赋值,名称为key i的string赋值value i

msetnx(key1, value1, key2, value2,key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i

incr(key):名称为key的string增1操作

incrby(key, integer):名称为key的string增加integer

decr(key):名称为key的string减1操作

decrby(key, integer):名称为key的string减少integer

append(key, value):名称为key的string的值附加value

substr(key, start, end):返回名称为key的string的value的子串3对List操作的命令

rpush(key, value):在名称为key的list尾添加一个值为value的元素

lpush(key, value):在名称为key的list头添加一个值为value的 元素

llen(key):返回名称为key的list的长度

lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)

ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素

lindex(key, index):返回名称为key的list中index位置的元素

lset(key, index, value):给名称为key的list中index位置的元素赋值为value

lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0 从头至尾删除count个值为val

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

SOA记录:start of authority,起始授权机构。该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。

格式如下:

alibabacom IN SOA dnsserveralibabacom mailalibabacom (

1

3h

1h

1w

1h )

第四列指定了"dnsserveralibabacom"为该域的master DNS服务器。

第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点"",正如上面的例子" mailalibabacom ",其实际表示的是" mail@alibabacom "。

第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:

alibabacom IN SOA dnsserveralibabacom mailalibabacom ( 1 3h 1h 1w 1h )

前三列是声明性的语句,表示"alibabacom"这个域内的起始授权机构为第四列的值"dnsserveralibabacom"所表示的主机。第五列和第六列是SOA的附加属性数据。

每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。

注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

NS记录:name server,存储的是该域内的dns服务器相关信息。即NS记录标识了哪台服务器是DNS服务器。格式如下:

alibabacom IN NS dnsserveralibabacom

前三列仍然是声明性语句,表示"alibabacom"域内的DNS服务器(name server)为第四列值所表示的"dnsserveralibabacom"主机。

如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:

alibabacom IN NS dnsserver1alibabacom

alibabacom IN NS dnsserver2alibabacom

表示主机"dnsserver1alibabacom"和主机"dnsserver2alibabacom"都是域"alibabacom"内的dns服务器,但没有区分出主次dns服务器。

不少朋友搞不懂SOA记录,也很容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,SOA的名称"起始授权机构"所表示的意思也就容易理解了。

A记录:address,存储的是域内主机名所对应的ip地址。格式如下:

dnsserveralibabacom IN A 172161015

客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。

AAAA记录存储的是主机名和ipv6地址的对应关系。

PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:

161016172in-addrarpa IN PTR wwwalibabacom

表示解析172161016地址时得到主机名" wwwalibabacom "的结果。

CNAME记录:canonical name,表示规范名的意思,其所代表的记录常称为别名记录。之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是fqdn。格式如下:

www1alibabacom IN CNAME wwwalibabacom

最后一列就是规范名,而第一列是规范名即最后一列的别名。当查询" www1alibabacom ",dns服务器会找到它的规范名" wwwalibabacom ",然后再查询规范名的A记录,也就获得了对应的IP地址并返回给客户端。

CNAME记录非常重要,很多时候使用CNAME可以解决很复杂的问题。而且目前常用的CDN技术有一个步骤就是在dns服务器上设置CNAME记录,将客户端对资源的请求引导到与它同网络环境(电信、网通)以及地理位置近的缓存服务器上。

MX记录:mail exchanger,邮件交换记录。负责转发或处理该域名内的邮件。和邮件服务器有关,且话题较大,所以不多做叙述,如有深入的必要,请查看《dns & bind》中"Chapter 5 DNS and Electronic Mail"。

关于资源记录,最需要明确的概念就是它不仅仅用来区分和标识区域数据的类型,还用来存储对应的域数据。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 怎么reset mysql master

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情