码迷,mamicode.com
首页 > 数据库 > 详细

(?)企业部分之MySQl

时间:2016-06-28 00:48:55      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:mysql

(1)MySQL数据的复制

   MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务器,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

 

(2)MySQL数据复制的原理

   MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

   每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。

   认识到二进制日志只是一个从启用二进制日志的固定时间点开始的记录非常重要。任何设置的从服务器需要主服务器上的在主服务器上启用二进制日志时的数据库拷贝。如果启动从服务器时,其数据库与主服务器上的启动二进制日志时的状态不相同,从服务器很可能失败。

    MySQL数据库的复制需要启动三个线程来实现:

   其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。

   在前面的描述中,每个从服务器有3个线程。有多个从服务器的主服务器创建为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。

   这样读取和执行语句被分成两个独立的任务。如果语句执行较慢则语句读取任务没有慢下来。例如,如果从服务器有一段时间没有运行了,当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程远远滞后。如果从服务器在SQL线程执行完所有索取的语句前停止,I/O 线程至少已经索取了所有内容,以便语句的安全拷贝保存到本地从服务器的中继日志中,供从服务器下次启动时执行。这样允许清空主服务器上的二进制日志,因为不再需要等候从服务器来索取其内容。


(3)可能存在的问题

延迟问题——新版本的MySQl大致可以解决该问题;更改模型,可以减少延迟

复制过程中出错的问题——采用半同步可避免

HA集群切换导致的问题——可用lock master 解决


##Linux自带的MySQl##

1. MySQl的主从复制(AB)

 

防火墙关闭,SELnux Disabled

 

server1

yum install -y mysql-server
/etc/init.d/mysqld start
mysql_secure_installation

vim /etc/my.cnf

[mysqld]最后添加以下内容:

server-id=1

log-bin=mysql-bin    ##默认不打开二进制日志

技术分享


/etc/init.d/mysqld restart
cd /var/lib/mysql/
mysqlbinlog mysql-bin.000001    ##二进制日志

技术分享


mysql -p
mysql> grant replication slave on *.* to wjl@‘172.25.45.2‘ identified by ‘westos‘;
mysql> show master status;
mysql> show databases;
mysql> quit

技术分享


mysqlbinlog mysql-bin.000001

技术分享


server2

yum install -y mysql-server
mysql -h 172.25.45.1 -uwjl -p
vim /etc/my.cnf

[mysqld]最后添加一行:server-id=2


/etc/init.d/mysqld start
mysql_secure_installation
mysql -p
mysql> show slave status;
mysql> change master to master_host=‘172.25.45.1‘,master_user=‘wjl‘,master_password=‘westos‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=255;
mysql> start slave;
mysql> show slave status;
mysql> show slave status\G;
mysql> show databases;
mysql> quit

 技术分享


测试:

server1

mysql -p
mysql> create database westos;
mysql> use westos;
mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null);
mysql> show tables;
mysql> insert into usertb value (‘user1‘,‘123‘);
mysql> insert into usertb value (‘user2‘,‘456‘);
mysql> delete from usertb where username=‘user2‘;
mysql> update usertb set passwd=passwd(‘456‘);    ##边做边看server2是否同步


server2

mysqlbinlog mysql-bin.000001


mysql -p
mysql> show databases;
mysql> use westos;
mysql> show tables;
mysql> desc usertb;
mysql> select * from usertb;


cd /var/lib/mysql/
cat relay-log.info    ##判断不同并记录
cat master.info

技术分享

 

2.主从复制应用(ABC)

server2

vim /etc/my.cnf

添加以下内容:

log-bin=mysql-bin

log-slave-updates

技术分享


/etc/init.d/mysqld restart
ls /var/lib/mysql

技术分享


mysql -p
mysql> show master status;
mysql> grant replication slave on *.* to wjl@‘172.25.45.3‘ identified by ‘westos‘;
mysql> show databases;
mysql> quit


server3】

yum install -y mysql-server
mysql -h 172.25.45.2 -uwjl -p
vim /etc/my.cnf

[mysqld]最后添加一行:server-id=3

/etc/init.d/mysqld start
mysql_secure_installation


mysql -p
mysql> show slave status;
mysql> change master to master_host=‘172.25.45.2‘,master_user=‘wjl‘,master_password=‘westos‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=255;
mysql> start slave;
mysql> show slave status\G;
mysql> show databases;
mysql> quit

技术分享

 

server1】

scp mysql-bin.000001  root@172.25.45.3:/var/lib/mysql/

 

server3】

mysql -p
mysql> show databases;
mysql> quit

mysqlbinlog  mysql-bin.000001 --start-position=255 --stop-position=490 | mysql -pwestos    ##执行server2上执行的操作

 

##mysql5.7版本##

1.

server1/server2

rm -rf /var/lib/mysql/*
rpm -qa | grep mysql
yum remove mysql mysql-server 
rpm -e mysql-libs --nodeps/  rpm -e `rpm -qa | grep mysql` --nodeps
rpm -qa | grep mysql    ##卸载干净,不然和新版本会有冲突

 

需要软件包:

mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar

 

server1】

tar -xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
scp mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm root@172.25.45.2:
yum install -y mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm
/etc/init.d/mysqld start
cat /var/log/mysqld.log | grep password

技术分享


mysql_secure_installation    ##新版本对密码的要求更高
vim /etc/my.cnf

在最后添加以下内容:

server-id=1

log-bin=mysql-bin

 

/etc/init.d/mysqld restart
mysql -p
mysql> grant replication slave on *.* to wjl@‘172.25.45.2‘ identified by ‘Westos+123‘;
mysql> show master status;
mysql> quit

技术分享

 

server2】

yum install -y mysql-community-client-5.7.11-1.el6.x86_64.rpm mysql-community-common-5.7.11-1.el6.x86_64.rpm mysql-community-server-5.7.11-1.el6.x86_64.rpm mysql-community-libs-5.7.11-1.el6.x86_64.rpm
mysql -h 172.25.45.1 -uwjl -pWestos+123    ##可成功登录
vim /etc/my.cnf

在最后添加一行:server-id=2

/etc/init.d/mysqld start
cat /var/log/mysqld.log | grep password

技术分享


/etc/init.d/mysqld start
mysql_secure_installation
mysql -p
mysql> start slave;
mysql> show slave status\G;
mysql> show databases;
mysql> quit

技术分享

 

测试:

server1

mysql -p
mysql> create database westos;
mysql> use westos;
mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null);
mysql> show tables;
mysql> insert into usertb value (‘user1‘,‘123‘);
mysql> insert into usertb value (‘user2‘,‘456‘);
mysql> delete from usertb where username=‘user2‘;
mysql> update usertb set passwd=passwd(‘456‘);##边做边看server2是否同步

 

server2

 

mysqlbinlog mysql-bin.000001
mysql -p
mysql> show databases;
mysql> use westos;
mysql> show tables;
mysql> desc usertb;
mysql> select * from usertb;


2.

server2】

mysql -p
mysql> stop slave;
mysql> quit

 

server1/server2】

vim /etc/my.cnf

在最后添上以下内容:

gtid-mode=on

enforce-gtid-consistency=on

 

/etc/init.d/mysqld restart

 

server2

mysql -p
mysql> show slave status\G;##slave依然开启
mysql> stop slave;
mysql> change master to master_host=‘172.25.45.1‘,master_user=‘wjl‘,master_password=‘Westos+123‘,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;

技术分享

 

测试:

server1

mysql -p
mysql> create database westos;
mysql> use westos;
mysql> create table usertb ( username varchar(25) not null, password varchar(25) not null);
mysql> show tables;
mysql> insert into usertb value (‘user1‘,‘123‘);
mysql> insert into usertb value (‘user2‘,‘456‘);
mysql> delete from usertb where username=‘user2‘;
mysql> update usertb set passwd=passwd(‘456‘);    ##边做边看server2是否同步


【server2】

 

mysqlbinlog mysql-bin.000001
mysql -p
mysql> show databases;
mysql> use westos;
mysql> show tables;
mysql> desc usertb;
mysql> select * from usertb;

技术分享


对应且增加

 

3.

server2

vim /etc/my.cnf

在最后添上以下内容:

slave-parallel-type=LOGICAL_CLOCK

slave-parallel-workers=16

master_info_repository=TABLE

relay_log_info_repository=TABLE

relay_log_recovery=ON

 

/etc/init.d/mysqld restart
mysql -p
mysql> show slave status\G;

技术分享


技术分享


技术分享

 

4.

server1】

需要一个sql文件——add.sql

mysql -p
mysql> use westos;
mysql> drop table usertb;
mysql> show processlist;
mysql> quit


mysql -pWestos+123 westos < add.sql
mysql -p
mysql> use westos;
mysql> call test1;


 技术分享


可通过mysql> show slave status\Gserver2查看进度


扩大server2内存空间

pvcreate /dev/vdb1
vgextend VolGroup /dev/vdb1
lvextend -L +10g /dev/VolGroup/lv_root
resize2fs /dev/VolGroup/lv_root

time mysqldump -pWestos+123 westos > westos.sql
time mysqlpump -pWestos+123 --default-parallelism=2 --compress-output=lz4 westos > test


(?)企业部分之MySQl

标签:mysql

原文地址:http://wjl19940429.blog.51cto.com/11354210/1793457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!