mysqlbinlog
是什么?
数据目录下的如下文件: mysql-bin.xxxxxx
作用?
记录数据库内部增删改查对mysql数据库有更新的内容的记录
三种模式?
statement level 模式: 缺点是不够细致
row level 模式:
日志会记录每一行数据被修改的形式
(一下子修改多行其实就一条语句, 但是它会记录成多行)
优点: 记录每一行的细节, 可以记录function/trigger/存储过程
mixed level 模式: 混合模式, 自动判断该使用statement还是row level
三种模式的配置?
log-bin=mysql-bin binlog_format = "MIXED"
在线修改即时生效
mysql> set global binlog_format="MIXED";
mysql日志
错误日志:
[mysqld_safe]
log-error = /usr/local/mysql/data/mysql.err
二进制日志:
log-bin=mysql-bin
查询日志:
普通日志:
gerneral_log = OFF #一般不开启, 没什么作用, 而且文件会特别大
gerneral_log_file = /usr/local/mysql/data/mysql.log
慢查询日志:
long_query_time = 1
log-slow-queries = /usr/local/mysql/data/slow.log
log_queries_not_using_indexes
存储引擎
体系结构图
事务的四大特性(ACID)
原子性
一致性
隔离性
持久性
start transaction;
commit;
rollback;
myisam引擎特点
不支持事务
表级锁定
读写互相阻塞
只会缓存索引
读取速度较快, 占用资源较少
不支持外键约束, 但支持全文索引
myisam引擎适合的生产环境
不需要事务支持
一般为读数据比较多或写比较多的场合
读写并发访问相对较低的业务(锁机制问题)
数据修改较少的业务(阻塞问题)
以读为主的业务
硬件资源比较差的机器
小结: 适合纯读或纯写的业务
myisam调优
设置合适的索引(缓存机制)
调整读写优先级
启用延迟插入(尽可能多条数据一次写入)
尽量顺序操作, 让insert数据都写入到尾部, 减少阻塞
分解大的操作, 减少单个操作的阻塞时间
降低并发数(要用到队列机制)
对于相对静态的数据, 充分利用query_cache或memcached服务来进行缓存
query_cache_size=2M
query_cache_limit=1M
query_cache_min_res_unit=2K
myisam的count只有在全表扫描的时候才特别高效 (即不能带where条件)
可以把主从同步的主库使用innodb, 从库使用myisam (来回复制数据会很麻烦, 不建议使用!!)
innodb引擎
支持事务
行级锁定 (全表扫描仍然是表锁)
读写阻塞与事务隔离级别相关
有非常高效的缓存特性: 能缓存索引和数据
整个表和主键以cluster方式存储, 组成一颗平衡树
所有 secondary index 都会保存主键信息
支持分区, 表空间
支持外键约束, 5.5版本以后支持全文索引
和myisam相比, innodb对硬件要求比较高
innodb引擎适合的生产环境
需要事务支持的业务
高并发场景(请先确保已经建立了索引)
数据读写都较为频繁的场景
数据一致性要求较高的业务
硬件设备好, 可以利用innodb的缓存能力
innodb调优
主键尽可能小, 避免给secondary index带来过大的空间负担
避免全表扫描, 因为会使用表锁
尽可能缓存所有的索引和数据
在大批量小插入的时候, 尽量自己控制事务
合理设置 innodb_flush_log_at_trx_commit参数(每隔几秒刷新log到磁盘), 不要设置为0, 即不要过度追求安全性
避免主键更新, 因为这会带来大量的数据移动
innodb重要参数
innodb_buffer_pool_size = 2048M #缓存池, 设置为机器总内存的50%--80%
批量更改存储引擎
法1: alter
ALERT TABLE tb1 ENGINE=INNODB;
法2: 使用sed对备份内容进行替换
nohup sed -e '/sMyISAM/InnoDB/g' tb1.sql > tb1_1.sql
法3: mysql_convert_table_format命令
mysql_convert_table_format --user=root --password=123456 --socket=/data/3306/mysql.sock --engine=MyISAM db1 tb1
;