MySQ binlog三种模式及设置方法

MySQ binlog三种模式及设置方法

1.1 Row Level 行模式

  日志中会记录每一行数 据被修改的形式,然后在slave端再对相同的数据进行修改
优点:row level模式下,bin-log中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条被修改。所以rowlevel的日志内容会非常清楚的记录下每一行数据修改的细节。不会出现某些特定的情况下的存储过程或function,以及trigger的调用和触发无法被正确复制的问题

缺点:row level,所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,会产生大量的日志内容。

1.2 Statement Level(默认)

  每一条会修改数据的sql都会记录到master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行
**优点:**statement level下的优点首先就是解决了row level下的缺点,不需要记录每一行数据的变化,减少bin-log日志量,节约IO,提高性能,因为它只需要在Master上锁执行的语句的细节,以及执行语句的上下文的信息。

缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些定的函数或者功能的时候会出现。

1.3 Mixed 自动模式

  在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

1.4 企业场景如何选择binlog模式

1、互联网公司,使用MySQL的功能相对少(存储过程、触发器、函数)
选择默认的语句模式,Statement Level(默认)
2、公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数)
则选择Mixed模式
3、公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数)又希望数据最大化一直,此时最好选择Row level模式

行模式和语句模式的区别

1.语句模式:
100万条记录
只需1条delete * from test;就可以删除100万条记录

2.row模式
100万条记录
记录100万条删除命令

1.5 如何配置binlog

在数据库中查看binlog模式

  1. root@oldboy 11:28:05->show global variables like '%binlog_format%';
  2. +---------------+-----------+
  3. | Variable_name | Value |
  4. +---------------+-----------+
  5. | binlog_format | STATEMENT |
  6. +---------------+-----------+
  7. 1 row in set (0.00 sec)

配置文件参数如下:

  1. [myslqd]
  2. log-bin=mysql-bin
  3. #binlog_format="STATEMENT"
  4. #binlog_format="ROW"
  5. #binlog_format="MIXED"

运行时在线修改临时

  1. mysql>SET GLOBAL binlog_format = 'ROW';
  2. mysql>show global variables like '%binlog_format%';
  3. 其他模式命令为:
  4. SET GLOBAL binlog_format = 'MIXED';
  5. SET GLOBAL binlog_format = 'STATEMENT';

解释:
GLOBAL=全局会话
SESSION=当前会话
检验ROW模式下binlog日志记录效果

  1. [root@db01 3306]# mysqlbinlog --base64-output="decode-rows" --verbose mysql-bin.000248
  2. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
  3. /*!40019 SET @@session.max_insert_delayed_threads=0*/;
  4. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
  5. DELIMITER /*!*/;
  6. # at 4
  7. #160628 11:06:52 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.49-log created 160628 11:06:52 at startup
  8. # Warning: this binlog is either in use or was not closed properly.
  9. ROLLBACK/*!*/;
  10. # at 107
  11. #160628 11:07:09 server id 1 end_log_pos 177 Query thread_id=1 exec_time=0 error_code=0
  12. SET TIMESTAMP=1467083229/*!*/;
  13. SET @@session.pseudo_thread_id=1/*!*/;
  14. SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
  15. SET @@session.sql_mode=0/*!*/;
  16. SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;/*!\C utf8 *//*!*/;
  17. SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
  18. SET @@session.lc_time_names=0/*!*/;
  19. SET @@session.collation_database=DEFAULT/*!*/;
  20. BEGIN
  21. /*!*/;
  22. # at 177
  23. # at 223
  24. #160628 11:07:09 server id 1 end_log_pos 223 Table_map: `oldboy`.`sc` mapped to number 33
  25. #160628 11:07:09 server id 1 end_log_pos 785 Update_rows: table id 33 flags: STMT_END_F
  26. ### UPDATE `oldboy`.`sc`
  27. ### WHERE
  28. ### @1=1
  29. ### @2=1001

mysql的主从配置

基础环境

系统:linux
mysql版本:5.5
主服务器IP:192.168.1.101
从服务器IP:192.168.1.102

1.主服务器(master)要打开二进制日志
2.从服务器(slave)要打开relay日志
3.在主服务器(master)上建立replcation账号授权给从服务器(slave)
4.修改从服务器(slave)的master服务器
5.启动slave

操作步骤:

1.主库的操作

vim /etc/my.cnf

然后在[mysqld]下添加如下配置

#给服务器起一个唯一的id
server-id=1
#开启二进制日志
log-bin=mysql-bin
#指定日志格式
binlog-format=mixed

保存后重启mysql

2.从库操作

vim /etc/my.cnf

然后在[mysqld]下添加如下配置

#给服务器起一个唯一的id
server-id=2
#从服务器中继日志
relay-log=mysql-relay

保存后重启mysql

3.在主服务器上创建相应的复制账号

grant replication client,replication slave on *.* to replName@’192.168.%.%’ identified by ‘123456’;

其中是replName是帐号名,123456是密码,这两项都可以自己修改

4.在从服务器通过语句指定要复制的主服务器(注意,可以一主多从,不可一从多主).

change master to 
master_host=’192.168.1.101’, 
master_user=’replName’, 
master_password=’123456’, 
master_log_file=’mysql-bin.000001’, 
master_log_pos=0;

说明:
master_host是主服务器IP
master_user是刚才设置的主服务器复制帐号
master_password是刚才设置的主服务器复制帐号密码
master_log_file是主服务器二进制日志文件
master_log_pos是复制二进制文件的开始点
master_log_pos和master_log_file可以在主数据库中通过执行show master status;获取到

5.启动slave

slave start

注意防火墙设置

主主配置

主从配置搞完以后,主主配置就很简单了,

基本思路:

1: 2台服务器都设置上2进制日志和relay日志
2: 都设置上replcation复制账号
3: 都设置对方为自己的master

linux lftp命令

1、登录ftp
代码:
lftp 用户名:密码@ftp地址:传送端口(默认21)
用法
(1)lftp username:password@127.0.0.1:21 回车
(2)lftp username@127.0.0.1 回车     ##默认21端口 回车后输入密码
(3)lftp 127.0.0.1 回车   ##回车后 login 登录
(4)lftp 回车 –> open 127.0.0.1 –> login 登录

2、lftp中文乱码问题
对于像我这样的新手,登录后看到的都是中文乱码(因为一般本地都是utf-8的编码),怎么半呢,用 set 命令来解决

set ftp:charset gbk(或者 gb2312 或 utf-8) ##设置ftp端的编码格式
set file:charset utf-8 (…同上) ##设置本地编码格式

附:set命令的技巧 (1)输入set 查看已经设置好的命令 (2)set -a 查看所有可以设置的命令清晰网


3、查找ftp端文件

ls *.txt ##查找当前目录下的所有txt文件
ls ./123/ ##列出123目录下所有文件
find . -name “*.txt”   ##递归查找站点上所有的txt文件
find ./xx -name “*.txt” ##查找xx目录下所有的txt文件

附1: ls第二次读取的是本地缓存,可以用 rels 代替 ls 或者catch off / catch on 来开关catch,catch flush清空本地catch
附2: 浏览本地目录的命令可用!ls, 如 !ls /usr/local/bin/


4、下载文件

下载文件之前要先设置好本地的目录,用来存放下载的文件
lcd /home/123/web   ##设置本地存放目录 默认为 /home/usr

get 123.txt     ##下载123.txt文件到 /home/123/web 中
get -c 123.txt ##断点续传下载
mget *.txt     ##批量下载所有txt文件
mget -c *.txt ##断点续传
mget -c ./123/aaa/*.txt   ##断点续传、批量下载ftp端aaa目录下的所有txt文件

pget -c -n 10 file.dat
##以最多10个线程以允许断点续传的方式下载file.dat
##可以通过设置 set pget:default-n 5 的值而使用默认值。

mirror aaa/
##将aaa目录整个的下载下来,子目录也会自动复制 本地自动建立目录


5、上传文件

put 123.txt     ##同下载
mput *.txt     ##同下载

mirror -R aaa/ ##同下载


6、设置被动/非被动模式

set ftp:passive-mode 1 ## 1 被动 0非主动


多任务处理

ctrl+z ##将当前进行的任务移交后台处理
wait   ##将后台处理任务调至前台查看
jobs   ##查看后台进行的任务列表
kill all 或者 job_no ##删除所有任务 或 指定的任务

##将任务加入任务列表
queue get 123.txt
queue put 234.txt
queue mirror aaa/

queue ##查看任务列表
jobs   ##查看后台任务列表

queue start ##开始任务列表
queue stop ##停止任务列表


其他命令清晰网

alias []
定义别名
alias less more
alias reconnect “close; cd .”
直接输入 alias 即可看到目前定义了那些别名。如果只输入 alias name 的话, 则是取消 name 这个别名。

bookmark SUBCMD
设定书签, 可将目前站台及所在目录设成书签, 下次可直接进来, 不用再 cd 来 cd 去的

bookmark add name 用来新增名称为 name 的书签
bookmark del name 删除名称为 name 的书签
bookmark list 显示目前有设定那些书签(另外直接打 bookmark 和 bookmark list 的结果一样)
bookmark edit 呼叫编辑器修改书签 (~/.lftp/bookmarks)

cd 切换远端目录

cache SUBCMD
管理 lftp 的 cache

rels []
从 cache 中显示远端档案列表
rels 则不会从 cache 中读取

recls opts [path/]pattern
从 cache 中显示远端的档案列表, 应该算是 ls 的加强版, 有很多参数可用,应该是可用来产生各种不同>的档案列表以供其他程式使用。
recls 则不会从 cache 中读取

du options
计算远端整个目录占用容量

get OPTS -o
抓取远端档案 清晰网

get rfile -o lfile
抓 rfile 到本地改名为 lfile
-c 为续传
-E 抓档完成后, 将远端的档案砍了
-a 为 ascii mode, 预设为 binary mode
-O 设定 base directory 为本地端放档案的目录

mget OPTS
下载远端档案(可用 wildcard expansion 也就是 *)

pget OPTS -o
使用多个连结来下载档案, 预设为五个。
-n 3 为叁个连结

jobs -v
显示目前有那些程序在背景执行
-v 显示详细的资讯(-v 可多加几个来显示更详细的资讯)

lcd
切换本地端的目录

mirror OPTS remote [local]
下载整个目录(楼上的 get 只能用来抓档案)
-c 续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-R 上传整个目录
-n 只下载较新的档案
-r 不用递回到目录中
–parallel=n 同时下载 n 个档案(预设一次只下载一个)清晰网

module name args
载入模组

put OPTS -o
上传档案

mput OPTS
上传档案(可用 wildcard expansion 也就是 *)

mv
将远端的 file1 改名为 file2

mrm
用 wildcard expansion 方式来删除远端档案

open OPTS
开启某个站台
open -u , -p site

queue OPTS []
将 cmd 放到伫列中等待执行
-d index 将编号为 index 的 job 删除
-m index new_index 将编号为 index 的 job 移至编号 new_index, 插队专用。
-n index 在编号 index 之前新增一个 job

wait []
将背景执行中的程序移至前景(也可用 fg)

kill all|
删除全部的 jobs 或 job_no

repeat delay command
每隔 delay 秒, 重覆执行 command, 预设是每隔一秒

rm -r -f
移除远端档案

mkdir -p
建立远端目录

rmdir -f
移除远端目录

set OPT []
设定变数
直接键入 set 可看目前定义了那些变数

source
读取 file, 并执行 file 中的命令(应该是和 bash 中的 source 命令是一样的吧)

debug [|off] -o
设定 debug level 为 level
-o 将输出导向至 file

exit [|bg]
结束 lftp
此时若还有 jobs, 则会将 lftp 放至背景执行, 继续未完成的工作

history -w file-r file-c|-l cnt
和 bash 中的 history 功能一样

renlist []
只显示远端的档名

pwd -p
显示目前远端所在目录
-p 连登入密码也显示

scache []
只打 scache 显示目前所有的 session, 加上 session_no 可切换至其他的 session,
对於同时开启多个站台或同个站台不同目录间切换。

国内的大多数ftp服务器使用的中文编码是gbk,而linxu大多数版本(包括debian,redhat,centOS,fc等版本)默认的编码是utf-8,于是会出现访问ftp服务器是出现中文乱码的问题,解决办法有两种:
1、临时解决
用lftp登录到ftp服务器上,设置远程服务器编码为gbk,而设置本地编码为utf-8,做法为:输入下面两个命令:
set ftp:charset gbk
set file:charset utf8

2、永久解决
在目录$HOME/.lftp编辑文件(如果没有则建立)rc,输入下面两行,设置远程编码为gbk,本地编码为utf-8:
set ftp:charset gbk
set file:charset utf8
这种方法会导致访问utf8编码的服务器时出现中文乱码,不过就目前国内环境来说机会比较少。如果出现乱码时则临时输入下面两行就可以了:
set ftp:charset utf8
set file:charset utf8

另外一个用的很多的图形界面的ftp客户端是gftp,在选项中可以选择编码,用惯了win下客户端的人应该能够很快的早到编码选择的地方,选择服务器端的编码为gbk就可以了。