MySQL 随笔

MySQL 随笔

MySQL锁

  • lock in share mode

共享锁; select field from table where_condition lock in share mode
上锁之后, 其它事务可以再上共享锁, 不能上排它锁. 即其它事务是可读的, 不是可写的

  • for update

排它锁; select field from table where_condition for update
上锁之后, 其它事务不能对该锁记录进行任何操作

MVCC

官方文档: https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html

MVCC可以使具有特定隔离级别的InnoDB事务执行一致的读取操作。

查看MySQL变量

# 查看所有变量
$ show variables

# 对变量进行过滤
$ show variables where variable_name like '%name%'

主从复制

Github: https://github.com/DNGiveU/mysql-binlog-connector-java

binlog 日志 <-- relay 日志(IO线程拉主库的binlog日志写到relay日志中,SQL线程读取relay日志写数据,master库的binlog文件名以及位置会记录到master-info文件中)

master
	CREATE USER 'slave_user'@'%' IDENTIFIED BY 'slave_password';
	GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
	FLUSH PRIVILEGES;
	-- show master status; -- 确定复制的binlog文件以及pos
slave
	change master to master_host='ip', master_user='slave_user', master_password='slave_password', master_log_file='master_bin_log_file', master_log_pos = 4;
	-- show slave status;
	start slave;
$ show status

查看其中的Seconds_Behind_Master选项,可以看到从库复制主库落后了几ms

问题

  • 主库数据丢失问题

就是主库突然机,然后恰好数据还没有同步到从库,那么数据有可能丢失

  • 同步延迟问题

从库同步主库数据的过程是串行化的,也就是说主库上并行操作,在从库上回串行执行。所以拷贝是由延迟的,在高并发下尤为明显

解决问题

  • 半同步复制

也叫semi-sync复制,指的是主库写入binlog日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的relay log之后,接着会返回一个ack给主库,主库接收到至少一个从库的ack之后才会认为写操作完成了

  • 并行复制

并行复制用来解决主从同步延时问题。指的是从库开启多个线程,并行读取relay log中不同库的日志,这是库级别的并行

MySQL binlog

记录mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中。作用如下:

  • 复制
  • 数据恢复:通过mysqlbinlog工具恢复数据
  • 增量备份

查看binlog环境信息:show variables like '%log_bin%'

参数:log_bin/binlog_format (row(默认,sql解码:--base64-output=decode-rows-v)/statement/mixed)

binlog 内容

工具解析:mysqlbinlog mysql-binlog-file.001 (参数:--start-position/--stop-position/--start-time/--stop-time)

命令解析:show binlog events [in 'binlog_file_name'] [from pos] [limit [offset,] row_count]

备份

mysqldump -u root -p --databases dbName1,dbName2... > backup.sql

恢复

二进制文件恢复(生成sql文件,再执行sql文件,位置可通过查看binlog内容确定):mysqlbinlog --start-position=x --stop-position=y mysql-bin-file.x > backup.sql

恢复数据(执行导入sql)

mysql -u root -p dbName < backup.sql

二进制日志重做

mysqlbinlog binlog-file | mysql -u root -p

# MySQL 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×