您的位置:首页 > 数据库 > MySQL

第 四 十 二 天:mysql 使 用 的 相 关 问 题

2015-10-27 09:58 246 查看
小Q:生命太短,去爱那些对你好的人,忘掉那些不珍惜你的人。
======================================================================
mysql主上不写bin-log了?------------------------------------------
Replication时,当主执行sql后,会记录二进制log文件(bin-log);从会从主上获取到binlog,存于本地的relay-log;
当AB为主从,BC又为主从,AB可以可以顺利同步数据,但B上却不写binlog,导致C无法同步?

解决:在B的my.cnf文件中添加 log-slave-updates
mysql远程备份压缩解压一条命令?------------------------------------

实现把A服务器上的数据导入到B,但是B没有联网,需要借助跟B在一个内网的但是可以联网的C来完成,登录C,然后操作;

解决:ssh user@机器AIP -p sshport "/usr/local/mysql/bin/mysqldump -uroot --single-transaction --master-data=2 -q --flush-logs --databases databasename |bzip2 -" |bzip2 -d |tee /data/1.sql |mysql -hBIP -Pport -uusername -ppasswd
增加slave却不用停止master?----------------------------------------

我们一般在做主从的时候,都需要把主停掉,然后更改相关设置,添加一个从,但有时我们因为某些原因不能停掉主,这时该怎么办呢?A:主 B从 添加C
解决:登陆B,停止服务,记录master_log_pos和master_log_file的值

mysql -uroot  -p
stop slave
show slave status
使用mysqldump备份B slave,生成备份sql文件

mysqldump -uroot -p dbname > dbname_back.sql
使用B slave备份好的sql文件恢复到C slave中

mysql -uroot -p dbname < dbname_back.sql
在B slave和C slave上start slave

#在C上
change master to master_host=’10.1.2.1‘, master_port=3306, master_user ='master', master_password='password', master_log_file ='mysql-bin.000001', master_log_pos=123;
#B上
start slave
附加:其实这时候我有个疑问,即使不停止A,停止B也会在期间使AB数据不一致,那样再连接还能同步吗?

其实主从间的数据库不是实时同步的,就算网络正常,也存在瞬间,主从数据不一致;如果主网络断开,从会在网络正常后,批量同步;
其实相反的话,即使什么都正常,也有可能造成主从断开,因为这个机制有些bug,不稳定,所以要写个脚本对show slave status\G;出来的I/O和SQL进行监控;
mysql导入大文件时造成重启?----------------------------------------

一个100多G的sql文件导入时,大概1个多小时就会自动断了,报错:
mysql lost connection during query
日志中发现,mysql有重启的痕迹。 找了半天cron之类的,并没有发现什么问题,而去期间也并没有人去手动重启mysqld服务。
一开始怀疑是某些参数设置不当,比如 max_allowed_packet 或者 connection_timeout 等参数设置的太小,都调整后,问题依旧。最后偶然发现 swap 竟然用完了,但是内存剩余还很多。

解决:mysql的配置文件调整 innodb_buffer_pool_size
原因:因为服务器上跑着两个mysql,内存一共为32G, 其中一个我设置了

innodb_buffer_pool_size = 16G
另一个设置
innodb_buffer_pool_size = 28G
这俩加一起远远超出了32G,所以服务器开始使用swap了,当swap用尽后,就会自动重启mysql了。

mysql Replication 复制级别?-------------------------------------------------

Mysql的复制可以是基于一条语句(Statement level),或是基于一条记录(Row level),可以在Mysql的配置参数中设定这个复制级别,不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。

Row Level:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。
优点:在row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或function,以及 trigger的调用和触发无法被正确复制的问题。
缺点:row level下,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容;
比如有这样一条update语句:update product set owner_member_id = ‘b’ where owner_member_id = ‘a’,执行之后,日志中记录的不是这条update语句所对应额事件(mysql以事件的形式来记录bin-log日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件。自然,bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候,产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动,实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。
Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。
优点:statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能。因为他只需要记录在Master上所执行的语句的细节,以及执行语句时候的上下文的信息。
缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是,由于Mysql现在发展比较快,很多的新功能不断的加入,使mysql得复制遇到了不小的挑战,自然复制的时候涉及到越复杂的内容,bug也就越容易出现。在statement level下,目前已经发现的就有不少情况会造成mysql的复制出现问题,主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现,
比如:sleep()函数在有些版本中就不能正确复制,在存储过程中使用了last_insert_id()函数,可能会使slave和master上得到不一致的id等等。由于row level是基于每一行来记录的变化,所以不会出现类似的问题。

从官方文档中看到,之前的Mysql一直都只有基于statement的复制模式,直到5.1.5版本的Mysql才开始支持row level的复制。从5.0开始,Mysql的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现,给Mysql的复制又带来了更大的新挑战。另外,看到官方文档说,从5.1.8版本开始,Mysql提供了除Statement Level和Row Level之外的第三种复制模式:Mixed,实际上就是前两种模式的结合。在Mixed模式下,Mysql会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样,仅仅记录执行的语句。而新版本的Mysql中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录,如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

======================================练习题========================================
1. mysql replication模式主要应用在什么场景呢?

应用在mysql数据库的实时备份;读写分离;mysql的HA集群等

2. 在一台服务器上同时配置两个mysql服务的时候,如果已经配置完一个mysql服务,配置另一个的时候如何更改监听端口?
vim /etc/my.cnf #更改[mysqld]下的 port = 3306

3. 想要让mysql开机启动,需要把启动命令放到哪个文件下?
/etc/rc.local 或者加入chkconfig --add mysqld >> chkconfig mysqld on

4. 在master的配置文件中,都修改了哪几个配置选项?
server-id=1 #需要和从的id区分开
log-bin=mysql-bin #以什么名字记录logbin,自定义

5. 如何给mysql设置root密码?
mysqladmin -uroot password '123456' (mysqladmin -uroot -p 旧密码 password 新密码)
#或/usr/locla/mysql/bin/mysql -uroot -h ip 或 ...mysql -uroot -S /tmp/mysql.sock
update user set password=passwd where use='root'; >>> flush privileges;
#或 set password for 'root'@'localhost'=passwd ; >>> flush privileges ;

6. 配置replication模式时,master上需要给slave授予什么样的权限?
grant replication slave on *.* to 'repl'@'ip' identified by 'pass';

7. mysql有一个选项,可以不进入mysql的命令控制台就可以使用sql语句操作,是哪一个选项?
-e

8. 如何在slave上查看主从是否正常?
show slave status\G; 查看 I/O 和 SQL是否为yes

9. replication模式下,如果想重启master, slave必须先操作什么?
slave 上必须先slave stop;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Linux mysql