alter
table
t55
add
c1
int
;
delete
from
t55
where
id
<
100
;(执行顺畅)
alter
table
t1 modify c1
varchar
(
90
);
delete
from
t55
where
id
<
100
;(卡住一会后才执行)
3
)pt
-
online
-
schema
-
change工具
.
/
pt
-
online
-
schema
-
change
--
user=root --password=123456 --host=localhost --socket=/mysqldata/node4/mysqld.sock D=db55,t=t55 --alter "add c2 int" --print --dry-run
3.加权限
grant select,insert,delete on *.* to netease@'localhost' identified by '163';
#mysql -unetease -p163 --socet=/mysqldata/node3/mysqld.sock --port=4001(登陆成功)
grant select,insert,delete on *.* to netease@'localhost' identified by '123';
#mysql -unetease -p163 --socet=/mysqldata/node3/mysqld.sock --port=4001(登陆失败)
4.导数据
use db1;
select count(*) from t1;(先看一下数据量)
1)mysqldump导出
#mysqldump -uroot -p123456 --single-transaction --socket=/mysqldata/node3/mysqld.sock db1 t1 > /tmp/t1.sql
grant select on *.* to netease@'localhost' identified by '163';
#mysqldump -unetease -p163 --socket=/mysqldata/node3/mysqld.sock db1 t1 > /tmp/t2.sql(报错,没有锁表权限)
#mysqldump -unetease -p163 --single-transaction --socket=/mysqldata/node3/mysqld.sock db1 t1 > /tmp/t2.sql(成功)
#mysqldump -uroot -p123456 --single-transaction --socket=/mysqldata/node3/mysqld.sock db1 t1 -T /tmp
use db1;
2)以file权限into outfile导出数据
select * from t1 into outfile '/tmp/t1_2.txt';
select t1.c,t3,b from t1.id=t3.id into outfile '/tmp/t13.txt';
5.数据库慢问题
../tcpstat --port 4001 -t 1 -n 0(tcpstat,查看每一个tcp连接的响应时间,percona公司出品)
为什么要调整参数
不同服务器之间的配置,性能不一样
不同业务场景对数据的需求不一样
mysql的默认参数只是个参考值,并不适合所有的应用场景
优化之前我们需要知道什么
服务器相关的配置
业务相关的情况
mysql相关的配置
服务器相关的配置
操作系统版本
CPU,网卡节电模式
服务器numa设置---内存分片,cpu对应内存;
RAID卡缓存
磁盘调度策略--write back
数据写入cache即返回,数据异步的从cache刷入存储介质
磁盘调度策略--write through
数据同时写入cache和存储介质才返回写入成功
write back 性能高于 write through
而write through 的安全性更高。
RAID --廉价的存储阵列
至少使用三块盘,总存储空间只有两块;因为它需要存储
校验数据块
;
高可用的实现,是通过校验数据块,来恢复数据;
局限,只能坏一块盘,才能通过另外两块盘的 存储校验数据块,进行数据恢复,如果坏了两块盘则不能进行数据恢复
RAID10
先对两块盘做RAID1,再做RAID0
RAID1保证数据安全性,RAID0保证数据扩展性;
局限,做RAID1的两块盘同时坏了,则也不能保证数据安全性;
RAID如何保证数据安全
BBU(Backup Battery Unit)
保证在电池有电的情况下,即使服务器发生掉电或者宕机,也能够将缓存中的数据写入到磁盘,从而保证数据的安全
innodb_flush_log_at_trx_commit:0,1,2
n = 0(高效,但不安全--无论服务器宕机或者mysql宕机都会丢数据)
每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上
n = 1 (低效,非常安全--都不会丢数据)
每个事务提交时候,把事务日志从缓存区写到日志文件中,并且,刷新日志文件的数据到磁盘上,优化使用此模式保证数据安全性
n = 2(高效,但不安全--服务器宕机会丢数据)
每个事务提交的时候,把事务日志数据从缓存区写到日志文件中,每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;
sync_binlog
控制每次写入binlog,是否都需要进行一次持久化
如何保证事务安全
innodb_flush_log_at_trx_commit&&sync_binlog 都设为1
事务要和binlog保证一致性---才不会导致主从不一致
事务提交过程
如果写入频繁导致redo log里对应的最老的数据脏页还没有刷新到磁盘,此时数据库将卡住,强制刷新脏页到磁盘
mysql默认配置文件才10M,非常容易写满,生成环境中应该提高redo log 的大小
innodb_io_capacity
innodb每次刷多少个脏页,决定innodb存储引擎的吞吐能力。
在SSD等高性能存储介质下,应该提高该参数以提高数据库的性能。
insert buffer
顺序读写 VS 随机读写
随机请求性能远小于顺序请求
将尽可能多的随机请求合并为顺序请求才是提高数据库性能的关键
insert buffer 对二级索引,的增删改,的操作缓存到 insert buffer中,然后将这些随机请求合并成顺序请求;
服务器配置要合理(内核版本,磁盘调度策略,RAID卡缓存)
完善的监控系统,提前发现问题
数据库版本要跟上,不要太新,也不要太老
数据性能优化:
查询优化:索引优化为主,参数优化为辅
写入优化:业务优化为主,参数优化为辅
innodb_flush_log_at_trx_commit 控制redo log 刷新
sync_binlog :控制二进制日志的刷新
innodb log file size: 重做日志循环写,如果太小,当新的写入来的时候,原日志文件写完且还没有持久化到磁盘,这时候就要阻塞写入;所以,增大事务日志大小,可能提升写性能;
innodb insert buffer:
插入缓冲,将随机读写,通过这个缓冲,合并成可能的顺序读写,以提高写性能。
只对二级且非唯一索引生效;
innodb_io_capacity:
innodb每次刷新多少个脏页,决定innodb存储引擎的吞吐能力
在SSD,下应该提高该参数以提高数据库性能;