
先上Master库:
mysql>show
processlist
查看下进程是否Sleep太多。发现很正常。
show
master
status
也正常。
mysql>
show
master
status
+-------------------+----------+--------------+-------------------------------+
|
File
|
Position
|
Binlog_Do_DB
|
Binlog_Ignore_DB
|
+-------------------+----------+--------------+-------------------------------+
|
mysqld-bin.000001
|
3260
|
|
mysql,test,information_schema
|
+-------------------+----------+--------------+-------------------------------+
1
row
in
set
(0.00
sec)
再到Slave上查看
mysql>
show
slave
status\G
Slave_IO_Running:
Yes
Slave_SQL_Running:
No
可见是Slave不同步
下面介绍两种解决方法:
方法一:忽略错误后,继续同步
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况
解决:
stop
slave
#表示跳过一步错误,后面的数字可变
set
global
sql_slave_skip_counter
=1
start
slave
之后再用mysql>
show
slave
status\G
查看:
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
ok,现在主从同步状态正常了。。。
方式二:重新做主从,完全同步
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况
解决步骤如下:
1.先进入主库,进行锁表,防止数据写入
使用命令:
mysql>
flush
tables
with
read
lock
注意:该处是锁定为只读状态,语句不区分大小写
2.进行数据备份
#把数据备份到mysql.bak.sql文件
[root@server01
mysql]#mysqldump
-uroot
-p
-hlocalhost
>
mysql.bak.sql
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失
3.查看master
状态
mysql>
show
master
status
+-------------------+----------+--------------+-------------------------------+
|
File
|
Position
|
Binlog_Do_DB
|
Binlog_Ignore_DB
|
+-------------------+----------+--------------+-------------------------------+
|
mysqld-bin.000001
|
3260
|
|
mysql,test,information_schema
|
+-------------------+----------+--------------+-------------------------------+
1
row
in
set
(0.00
sec)
4.把mysql备份文件传到从库机器,进行数据恢复
#使用scp命令
[root@server01
mysql]#
scp
mysql.bak.sql
root@192.168.128.101:/tmp/
5.停止从库的状态
mysql>
stop
slave
6.然后到从库执行mysql命令,导入数据备份
mysql>
source
/tmp/mysql.bak.sql
7.设置从库同步,注意该处的同步点,就是主库show
master
status信息里的|
File|
Position两项
change
master
to
master_host
=
'192.168.128.100',
master_user
=
'rsync',
master_port=3306,
master_password='',
master_log_file
=
'mysqld-bin.000001',
master_log_pos=3260
8.重新开启从同步
mysql>
stop
slave
9.查看同步状态
mysql>
show
slave
status\G
查看:
Slave_IO_Running:
Yes
Slave_SQL_Running:
Yes
好了,同步完成啦。
MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用。在宕机的时间内(1030秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能,易安装,不改变现有部署。MHA还支持在线切换,从当前运行master切换到一个新的master上面,只需要很短的时间(0.52秒内),切换时仅仅阻塞写 *** 作,并不影响读 *** 作,便于主机硬件维护。在有高可用,数据一致性要求的系统上,MHA 提供了强大的功能,几乎无间断的满足维护需要。
优点:
(1)主库自动监控和故障转移
在当前已存在的主从复制环境中,MHA可以监控主库故障,并自动转移故障。即使有一些从库没有接收到新的relay log events,MHA也会从接收过的其他从库中自动识别有差异的relay log events,并在没接收到的从库上进行数据的前滚,以此来保障主从数据的一致性。
MHA可达到秒级别故障转移(9~12秒监测到主库故障,任选7秒钟关闭主库电源主机避免脑裂,接下来对数据不全的从库进行数据的前滚(通过其他完整从库的中继日志relay log)),最后建立新的主库,总停机时间在(total downtime)10~30秒)。另外,在配置文件里可以配置一个从库优先成为主库,因为MHA修复了从库之间的一致性,dba就不用去处理一致性问题。当建立新的主库之后,并行恢复其他从库。即使有成千上万的从库,也不会影响恢复主库时间,从库也很快完成数据同步。
相关推荐:《Python教程》
例子:DeNA公司在150+主从环境中使用MHA。其中一个master崩溃,MHA在4秒完成故障转移,这是主动/被动集群解决方案无法完成的。
(2)互动(手动)master故障转移
MHA可以用来只做故障转移,即不监测主库状态,只作为故障转移的交互。
(3)非交互式故障转移
MHA也提供非交互式的故障转移(不监测主库状态,自动故障转移)。这个特性很有用,特别是你已经安装了其他软件监控主库。比如,用Pacemaker(Heartbeat)监测主库故障和vip接管,用MHA进行故障转移和从库提升。
(4)在线切换主库到不同主机
在很多情况下,有必要将主库转移到其他主机上(如替换raid控制器,提升主库机器硬件等等)。这并不是主库崩溃,而是计划维护必须去做的。计划维护会导致downtime,所以必须尽可能快的恢复。快速的主库切换和优雅的阻塞写 *** 作是必需的,MHA提供了这种方式。优雅的主库切换, 0.52秒内阻塞写 *** 作。在很多情况下0.52秒的downtime是可以接受的,并且不影响计划维护窗口。这意味着当需要更换更快机器,升级高版本时,dba可以很容易采取动作。
(5)master 崩溃不会导致主从数据不一致性
当master 崩溃后,MHA自动识别从库间relay log events的不同,然后应用于不同的从库上,最终所有从库都同步。结合通过半同步一起使用,几乎没有任何数据丢失。
(6)MHA部署不影响当前环境设置
MHA最重要的一个设计理念就是尽可能使用简单。其他高可用方案需要改mysql部署设置,MHA不会让dba做这些部署配置,同步和半同步环境都可以用。启动/停止/升级/降级/安装/卸载 MHA都不用改变(如启动/停止)mysql主从环境。
当你需要升级MHA到新版本时,不需要停止mysql,仅仅更新HMA版本,然后重新启动MHAmanger即可。有些高可用方案要求特定的mysql版本(如mysql cluster,mysql with global transaction id 等),而且你可能不想仅仅为了MasterHA而迁移应用。很多情况下,公司已经部署了许多传统的mysql应用,开发或dba不想花太多时间迁移到不同的存储引擎或新的特性上。
(7)不增加服务器费用
MHA 包含MHA Manager和MHA node。MHA node运行在每台mysql服务器上,Manager可以单独部署一台机器,可监控100+以上数量的数据库,总服务器数量不会有太大增加。需要注意的是Manager也可以运行在其中一台从库上。
(8)性能无影响
当监控主库时,MHA只是每几秒钟(默认3秒)发送ping包,不发送大的查询。主从复制性能不受影响。
(9)适用任何存储引擎
Mysql不仅仅适用于事务安全的innodb引擎,在主从中适用的引擎,MHA都可以适用。即使使用遗留环境的myisam引擎,不进行迁移,也可以用MHA。
架构
在架构上来说,MHA分为两类:
(1)Node
MHA是基于MySQL 主从复制环境的,在该环境中,不管是Master角色,还是Slave角色,都称为Node,是被监控管理的对象节点。Node服务器上需要安装MHA Node包。
(2)Manager
Manager为MHA架构中的管理者,建议部署在一台独立的服务器上,当然也可部署在某个Slave上,但该Slave永远不要被选择成为新的Master,否则故障切换后的MHA架构就失去了高可用性。Manager服务器需要安装MHA Manager包,并完善一个主配置文件。一个Manager可管理多套MySQL 主从复制环境。
1、MySQLdb
# 前置条件
sudo apt-get install python-dev libmysqlclient-dev # Ubuntu
sudo yum install python-devel mysql-devel # Red Hat / CentOS
# 安装
pip install MySQL-python
Windows 直接通过下载 exe 文件安装
#!/usr/bin/python
import MySQLdb
db = MySQLdb.connect(
host = "localhost", # 主机名
user = "root", # 用户名
passwd = "pythontab.com", # 密码
db = "testdb") # 数据库名称
# 查询前,必须先获取游标
cur = db.cursor()
# 执行的都是原生SQL语句
cur.execute("SELECT * FROM mytable")
for row in cur.fetchall():
print(row[0])
db.close()
2、mysqlclient
# Windows安装
pip install some-package.whl
# linux 前置条件
sudo apt-get install python3-dev # debian / Ubuntu
sudo yum install python3-devel # Red Hat / CentOS
brew install mysql-connector-c # macOS (Homebrew)
pip install mysqlclient
3、PyMySQL
pip install PyMySQL
# 为了兼容mysqldb,只需要加入
pymysql.install_as_MySQLdb()
import pymysql
conn = pymysql.connect(host = '127.0.0.1', user = 'root', passwd = "pythontab.com", db = 'testdb')
cur = conn.cursor()
cur.execute("SELECT Host,User FROM user")
for r in cur:
print(r)
cur.close()
conn.close()
4、peewee
pip install peewee
import peewee
from peewee import *
db = MySQLDatabase('testdb', user = 'root', passwd = 'pythontab.com')
class Book(peewee.Model):
author = peewee.CharField()
title = peewee.TextField()
class Meta:
database = db
Book.create_table()
book = Book(author = "pythontab", title = 'pythontab is good website')
book.save()
for book in Book.filter(author = "pythontab"):
print(book.title)
5、SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy_declarative import Address, Base, Person
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key = True)
street_name = Column(String(250))
engine = create_engine('sqlite:///sqlalchemy_example.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind = engine)
session = DBSession()
# Insert a Person in the person table
new_person = Person(name = 'new person')
session.add(new_person)
session.commit()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)