1.优雅关闭数据库
mysqladmin -uroot -p112233 shutdown
/etc/init.d/mysql stop
kill -USR2 'cat path/pid'
2.多实例mysql启动和关闭方法示例
启动:/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 >/dev/null &
关闭:${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.cock shutdown
3.强制Linux 不记录敏感的历史命令
#HISTCONTROL=ignorespace
4.环境变量的设置(改变提示符)
写入mysql的配置文件my.cnf中
[mysqld]
prompt \u@oldboy \r:\m:\s->
5.用户安全问题
delete from mysql.user;
grant all privileges on *.* system@'localhost' identified by '112233' with grant option
6.用户设置密码
命令行#
设置密码:mysqladmin -u root password'112233'
修改密码:
mysqladmin -u root -p '112233' password'123123'
mysqladmin -u root -p '112233' password'123123' -S /data/${port}/my.cock (多实例)
数据库>
update mysql.user set password=PASSWORD("112233")where user='root' and host='localhost';
提示:此法适合密码丢失后通过 --skip-grant-tables 参数启动数据库后修改密码
查看用户对应的密码
数据库>
select user,host,password from mysql.user;
flush privileges
7.单实例找回丢失的mysql root用户密码
1.首先停止mysql
/etc/init.d/mysqld stop
2.使用--skip-grant-tables启动mysql,忽略授权登陆验证。
mysqld_safe --skip-grant-tables --user=mysql &
mysql -u root -p
3.修改密码的方法:
update mysql.user set password=PASSWORD("112233")where user='root' and host='localhost';
8.多实例找回丢失的mysql root用户密码
1.关闭mysql
killall mysql
2.mysqld_safe --defaults-file=/data/${port}/my.cnf --skip-grant-tables &
3.修改密码的方法
update mysql.user set password=PASSWORD("112233")where user='root' and host='localhost';
4.修改密码报错方法处理:
路径问题导致找不到启动的脚本问题
cp /application/mysql/bin/mysqld_safe /application/mysql/bin/mysqld_safe.bak
sed -i 's#/usr/local/mysql#/application/mysql#g' /application/mysql/bin/mysqld_safe
9.sql语句
1.排序:
(升序)select user,host,password from mysql.user order by user asc;
(倒序)select user,host,password from mysql.user order by user desc;
2.删除用户:
delete from mysql.user where user='oldboy';
3.创建一个数据库:
create database huang;(安装时候没有指定字符集,那么默认是拉丁字符集数据库)
4.查看创建的数据库:
show create database db_name\G;
show databases like 'huang_gbk'
%huang% #%为通配符,匹配所有的内容
5.建立一个名为huang_gbk的GBK字符集数据库:
create database huang_gbk default character set gbk collate gak_chinese_ci;
6.建立一个名为huang_utf8的UTF-8字符集数据库:
create database huang_utf8 default character set utf8 collate utf8_general_ci;
7.编译的时候没有指定字符集或者指定了和程序不同的字符集,数据库已经在运行了,怎么解决?
指定字符集创建数据库即可。(上面的5.和6.即是方法)
8.删除数据库
drop database db_name;
9.连接数据库
use db_name;
查看当前连接的数据库: select db_name,; 查看数据版本:select version();
查看数据用户:select user(); 查看当前的时间:select now();
10.查看数据的表格
show tables;
10. 删除mysql系统多余的账号
drop user '用户'@'主机域';
如果drop删除不了(一般是特殊字符或者大写),可以用下面方式删除(以root用户,huang主机为例)
delete from mysql.user where user='root' and host='huang';
flush privileges;
11. 运维人员经常用grant命令创建用户同时进行授权:
grant all privileges on db_name.table_name to 'user'@'主机域' identified by 'password';
分开写:
create user '用户名'@'主机域' identified by 'password';
grant all on db_name.table_name to '用户名'@'主机域';
案例:创建huang用户,对test库具备所有权限,允许localhost主机登陆管理数据库,密码是password。
grant all privileges on test.* to huang@localhost identified by 'password';
查看授权情况:select user,host from mysql.user;
查看授权用户的具体权限:show grants for 'huang'@'localhost';
12. 授权局域网内主机远程连接数据库:
grant all on *.* test@'10.0.0.%' identified by 'password';
grant all on *.* test@'10.0.0.0/255.255.255.0' identified by 'password';
远程连接:mysql -uhuang -ppassword -h 10.0.0.1
用php服务器连接数据库的代码写法如下:
//$link_id=mysql_connect('主机名','用户','密码');
$link_id=mysql_connect('10.0.0.1','test','112233') or mysql_error();
if ($link_id){
echo "mysql successful by huang!";
}else {
echo mysql_error();
}
?>
13. 授权all privileges 后,要回收 select,insert,update,delete,这四个权限。
生成数据库表后,也要收回create,drop授权。
revoke insert,select,update,delete on *.* from '用户名'@'主机域';
生成数据库表后,也要收回create,drop授权。
revoke create on blog.* from '用户名'@'10.0.0.%';
14. 表格的操作
create table student(
id int(12) not null,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default null
);
查看表结构:desc db_table_name;
查看已建表的语句:show create table db_table_name\G
插入数据
15. 索引
主键索引
方法一、
create table student(
id int(12) not null AUTO_INCREMENT,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default null,
primary key(id),
KEY index_name (name)
);
提示:primary key(id) 是主键。
KEY index_name(name) 是字段普通索引。
优化:在唯一值多的列上建索引查询效率高。
方法二、
创建好表后,忘记加索引了:
先把原来的删除主键:
alter table student drop index index_name;
再利用alter命令修改id列为自增主键列
alter table student add index index_name(name);
创建前8个字符的索引
create index index_name on test(name(8));
创建联合索引
create index index_name_dept on test(name,dept);
创建联合索引(前N个字符创建的联合索引)
create index index_name_dept on test(name(8),dept(10));
创建唯一非主键索引
create unique index index_age on student(age);
创建主键索引
alter table student change id id int primary key auto_increment;
删除主键索引
alter table student drop primary key;
删除普通索引
alter table student drop index index_name;
drop index index_name on student;
索引疑问解决:
1.既然索引可以加快查询速度,那么就给所有的列建索引吧?
答:索引不但占用系统空间,更新数据时还需要索引数据的,因此,索引是一把双刃剑,并不是越多越好,
例如 :数十个到几百行的小表格上无需建立索引,更新频繁,读很少的业务要少建立索引。
2.到底那些列上可以创建索引呢?
select user,host,from mysql.user where host=....,索引一定要创建在条件列,而不是select后的选择数据的列,
另外我们要尽量选择在唯一值多的大表上建立索引。
小结:1.要在表的列上创建索引
2.索引会加快查询速度,但是会影响更新的速度。
3.索引不是越多越好,要在频繁查询的where后的条件列上创建索引。
4.小表或唯一值极少的列上不建索引,要在大表以及内容多的列上创建索引。
16. 往表中插入数据
1.新建一个简单测试的表test
create table test(
id int(4) not null auto_increment,
name char(20) not null,
primary key(id)
);
2.插入数据
insert into test(id,name) values(1,'huang');
select * from test
insert into test(name) values('huang'); #由于id为自动增加,所以只在name列插入值。
insert into test values (1,'huang'),(2,'huang'),(3,'huang'),(4,'huang'),(5,'huang');#多条数据插入
17. 数据库备份
mysqldump -uroot -p112233 -B huang >/opt/huang_bak.sql
备份后检查备份的sql数据内容:过滤无用信息。
grep -E -v "#|\/|^$|--" /opt/huang_bak.sql
18. 查询数据
select * from test;
select id,name from test;
select id,name from test limit 2; #只查询两个
select id,name from test where id=1; #条件查询
select id,name from test where id=1 and name=sheng; #多个条件查询
select id,name from test where id>1 and id<5; #范围查询
select id,name from test order by id desc; #排序
注意:字符查询条件要加''引号。
多表查询:
select student.Sno,student.Sname,course.Cname,SC.Grade from student,course,SC where=student.Sno=SC.Sno and course.Cno=SC.Cno order by Sno;
查看sql语句是不是走了索引:
explain select * from test where name='huang'\G
19. 修改表中指定条件固定的数据
update test set name='gongli' where id=3; #单一数据修改
20. 防止误操作案例
http://blog.51cto.com/oldboy/1321061
21. 删除表中的数据
delete from test where id=1; #删除了一整列
truncate table test; #直接清空整个表 清空物理文件
delete from test; #也是清空整个表 一行行删
22. 增删改表的字段
命令语法:alter table 表名 add 字段 类型 其他;
alter table test add sex char(4);
alter table test add sex char(4) after name; #在name列后增加sex 列
alter table test add sex char(4) first; #第一位
21. 更改表名
rename table test to test1;
alter table test rename to test1;
22. 字符集和乱码问题
解决乱码问题方法如下:
1. set names latinl; #设置字符集为插入数据的表的字符集,然后插入中文数据。
source /tmp/test.sql #直接把一堆命令执行了。
2. mysql -u root -p112233 --default-character-set=latinl test < test.sql
3. mysql -u root -p112233 -e "set names latinl;select * from db_name.table_name;"
4. 更改my.cnf客户端模块的参数,解决乱码问题
[client]
character-set-server=latinl
表库字符集设置:
create database huang_utf8 default character set utf8 collate utf8_general_ci;
linux 系统字符集
cat /etc/sysconfig/i18n
LANG="zh_CN.utf8"
开发的程序字符集设置
简体UTF8
http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_UTF8.zip
show variables; #看mysql的变量
show global status; #查看mysql的状态
set global key_buffer_size=15k #设置mysql的变量
show variables like 'key_buffer%'; #查看设置的变量是不是生效了
指定字符集来建表
create table student(
id int(4) not null auto_increment,
name char(20) not null,
primary key (id)
)engine=InnoDB auto_increment=10 default charset=utf8
23. 工具 mysqldump ,mysqlbinlog,mysql,mysqladmin 自己学习下。
24. 查看常用字符集对应的信息
mysql -uroot -p112233 -e "show character set ;"|egrep "gbk|utf8|latinl"|awk '{print $0}'
25. 修改字符集的流程
对于已有的数据想改字符集不能通过 “alter database character set *”
或者 “alter table tablename character set *” 这两个命令没有更新已有记录的字符集,
而是对新创建的表或者记录生效。
已经有记录的字符的调整,必须先将数据导出,经过修改字符集后重新导入后才可以完成。
修改数据默认编码
alter database [your db_name] charset [your character setting]
下面模拟将latinl 字符集的数据库修改为GBK字符的实际过程
1. 导出表结构
mysqldump -uroot -p --default-character-set=latinl -d db_name>alltable.sql
--default-character-set=latinl #表示以GBK字符集进行连接
-d #只导表结构
2. 编辑 alltable.sql 将 latinl 改为 GBK
3. 确保数据库不再更新,导出所有数据
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latinl db_name>alltable.sql
--quick #用于转储大的表,强制mysqldump 从服务器一次一行的检索数据而不是检索所有的行,并输出前 cache 到内存中
--no-create-info #不创建 create table 语句
--extended-insert # 使用包括几个vlaues 列表的多行insert 语法,这样子文件更小,IO也小,导入数据时会非常快。
--default-character-set=latinl # 按照原有字符集导出数据,这样子导出的文件中,所有中文都是可见的,不会保存成乱码
4. 打开 alldata.sql 将set names latinl 修改 set names gbk;
5. 建库
create database db_name default charset gbk;
6. 创建表,执行 alltable.sql
mysql -uroot -p db_name < alltable.sql
7. 导入数据
mysql -uroot -p db_name < alldata.sql
总结:1.建库及建表的语句导出,sed批量修改为utf8
2.导出所有数据
3.修改mysql服务端和客户端编码为utf8
4.删除原有的库及建表语句
5.导入新的数据库及建表的语句
6.导入mysql的所有数据
26. 工具 mysqldump的使用和参数说明(数据库的备份,非常重要,非常重要,非常重要)
语法:mysqldump -uroot -p'112233' db_name > 备份数据库名
原理:利用mysqldump 命令备份数据的过程,实际上就是把数据从mysql 库里以逻辑的sql语句形式直接输出。
mysqldump -uroot -p'112233' -B huang |gzip >/tmp/mysql.bak.sql.gz
1. 导出数据用 -B
2. 用gzip对备份的数据进行压缩
备份所有的库:
mysqldump -uroot -p'112233' -B -A --events|gzip >/tmp/mysql_all.bak.sql.gz
-F #刷新binlog日志
--master-data=1 # 增加binlog日志文件名及对应的位置点
--compact #去掉注释,适合调试输出,生产不用。
-A #所有的库
-x,--lock-all-tables #锁表
-l # 只读锁表
-d #只备份表结构
-t #只备份表的数据
--singl-transaction #适合innodb事务数据库备份
innodb 表在备份时,通常启用选项 --singl-transaction来保证备份的一致性,实际上
它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,确保本次会话(dump)时,不会看的其他的会话已经提交的数据。
myisam:
mysqldump -uroot -p'112233' -B -A --master-data=1 -x --events|gzip >/tmp/all.sql.gz
innodb:推荐使用
mysqldump -uroot -p'112233' -B -A -master-data=2 --singl --events -transaction|gzip >/tmp/all.sql.gz
分库备份方法:
1. mysqldump -uroot -p'112233' -e "show databases;"|grep -Evi "database|infor|perfor"|sed -r 's#^([a-z].*$)#mysqldump -uroot -p'112233' --events -B \1|gzip >/tmp/\1.sql.gz#g'|bash
2. 用脚本的for循环执行命令。
网站:http://edu.51cto.com/course/course_id-808.html
分库恢复方法:
for db_name in 'ls *.gz|sed 's#_bak,sql.gz##g'';do mysql -uroot -p'112233' <${db_name}_bak.sql;done
一个库,分表备份:
多表备份语法: mysqldump -uroot -p'112233' 表名1 表名2 > 备份的文件名
单表备份语法: mysqldump -uroot -p'112233' 库名 表名 > 备份的文件名
只备份表结构:
mysqldump -uroot -p'112233' --campact -d huang(库) student(表)
只备份表的数据:
mysqldump -uroot -p'112233' --campact -t huang student
27. source命令恢复mysql数据:
mysql>source /tmp/mysql.bak.sql
28. mysql进程-状态-在线修改参数
show full processlist; #查看正在执行的完整sql语句,完整显示
show variables; #查看数据的参数信息,例如:my.cnf里的参数生效情况
show status; #当前会话的状态
show global status; #查看数据库运行状态信息,很重要,要分析并做好监控
set global key_buffer_size=32777218 #不重启数据库调整参数,直接生效,重启后失效
mysql数控批量插入数据shell脚本实现(案例)
http://oldboy.blog.51cto.com/2561410/597511
不登陆数据库执行mysql命令小结
http://oldboy.blog.51cto.com/2561410/632608
mysql sleep进程过多解决办法???
29. mysqlbinlog #解析mysql的binlog日志(路径:数据目录下,data目录下)
作用:用来记录mysql内部增删改查等对mysql数据库有更新内容的记录。
拆库:
mysqlbinlog -d 库名 mysql-bin.000020 >库名.sql
指定开始位置和结束位置(输出开始位置510到结束位置650的所有binlog日志到pos.sql)
mysqlbinlog mysql-bin.000021 --start-position=510 --stop-position=650 -r pos.sql
根据时间指定开始位置和结束位置
mysqlbinlog mysql-bin.000021 --start-datetime='2017-03-20 02:25:35' --stop-datetime='2017-03-21 03:25:35' -r time.sql
30. 数据库mysql主从复制机制
备份数据的方法:
1. NFS网络文件共享可以同步存储数据
2. Samba 共享数据:http://oldboy.blog.51cto.com/4633273/1203553
3. 定时任务或者守护进程结合 rsync,scp
4. inotify+rsync 触发式实时数据同步
5. FTP数据同步
6. ssh key+scp/rsync
7. svn 管理
mysql主从复制简介:
例一:mysql自动批量制作主从同步需要的语句
cat |mysql -uroot -p '112233' << EOF
CHANGE MASTER TO
MASTER_HOST='192.168.11.89',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='112233',
MASTER_LOG_FILE='mysql-bin.000025',
MASTER_LOG_POS=439;
EOF
实战:
主库master:192.168.11.89
1. 修改/etc/my.cnf 配置文件
[mysqld]
server-id = 1
log-bin = /data/master/mysql-bin
判断是不是打开了log-bin
show varviables like 'log_bin';
2. 添加验证账号:
grant replication slave on *.* to 'rep'@'192.168.11.%' identified by '112233';
flush privileges;
3. 主库备份,方便下次灌进从库。
在一个窗口锁库,不能写库,只能读库,不能关闭
flush table with read lock;
然后再执行:show master status; #获取 log-bin 那个点
另外一个窗口执行备份命令
mysqldump -uroot -p'112233' -B -A --events --master-data=1|gzip >/tmp/mysql_all.bak.sql.gz
最后解锁
unlocks tables;
从库slave:192.168.11.100
1. 修改/etc/my.cnf 配置文件
[mysqld]
server-id = 2
log-bin = /data/slave/mysql-bin
2. 上面第3步执行完后。把数据灌进从库
先把主库的备份文件传到从库下
scp /tmp/mysql_all.bak.sql.gz [email protected]:/tmp/
最后把数据灌进去
mysqldump -uroot -p'112233'
3. 刷入同步需要的信息
CHANGE MASTER TO
MASTER_HOST='192.168.11.89',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='112233',
MASTER_LOG_FILE='mysql-bin.000025',
MASTER_LOG_POS=439;
上面的这些信息在 安装目录的/application/mysql/data/master.info
4.启动从库同步开关
start slave;
5. 最后看是不是正常工作了
show slave status\G
如果下面两个参数都是YES那么就正常了
Slave_SQL_Running:YES
Slave_IO_Running:YES
特别注意:
如果备份的时候用来了 --master-data=1 那么就不需要这两个配置参数了 MASTER_LOG_FILE='mysql-bin.000025', MASTER_LOG_POS=439;
31. 数据库mysql主从复制的问题集合
1. 主库 show master status 没结构,主库binlog 功能没有开,或者没有生效
shell#egrep "log-bin|server-id"
mysql>show varviables like 'server-id';
mysql>show varviables like 'log_bin';
提示:配置文件的参数和 show varviables 参数不一致。
2. 报错内容:Could not find first log file name in binary log index file.
MASTER_LOG_FILE='xxxxxxxx' 这个参数的问题。检查下
3. 非正常关闭的数据库,起不来了
rm -f /application/mysql/mysql.scok /application/mysql/*.pid
再重启
4. show varviables like '%timeout%';
显示(默认值):interactive_timeout = 28800
wait_timeout = 28800
如果超过时间不操作,会自动解锁。
5. 由于切换 binlog 导致 show master status 位置变化无影响
32. mysql主从复制原理要点
1. 异步方式同步
2. 逻辑同步模式,多种模式,默认是通过SQL语句执行
3. 主库通过记录binlog实现对从库的同步。binlog记录数据库的更新语句
4. 从库1个IO线程。从库由一个IO线程和一个SQL线程实现
5. 从库关键文件master.info relay-log relay-info 功能。
6. 如果从库还想级联从库,需要打开log-bin 和log-slave-updates 参数。
33. 生产场景快速配置mysql主从复制方案
1. 安装好要配置的从库数据库,配置好log-bin和server-id参数。
2. 无需配置主库my.cnf文件,主库log-bin和server-id参数默认就是配置好的
3. 登陆主库增加用于从库连接的主库同步的账户例如:rep,并授权replication slave同步权限
4. 使用半夜mysqldump带 --master-data=1 备份的全部数据恢复到从库。
6. 从库开启同步开关,start slave。
7. 从库show slave status\G ,检查同步状态,并在主库进行测试更新。
34. 生产场景mysql主从复制读写分离授权方案及实战
1. 从库,连接用户授权上控制
主库:rep 112233 192.168.11.89 3306 (select,insert,delete,update)
从库:主库的rep用户同步到从库,然后回收insert,delete,update权限。
不收回从库权限,设置read-only参数确保从库只读。
主库:rep_w 112233 192.168.11.89 3306 (select,insert,delete,update)
从库:rep_r 112233 192.168.11.100 3306 (select)
风险:rep_w 连接从库
设置read-only参数确保从库只读。
mysql库不同步:进行如下授权
主:rep 112233 192.168.11.89 3306 (select,insert,delete,update)
从:rep 112233 192.168.11.100 3306 (select)
缺陷:从库切换主库时候,连接用户权限问题。保留一个从库专门准备接替主。
实战:
主库:忽略授权表/etc/my.cnf
replicate-ignore-db = mysql
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
设置read-only参数确保从库只读。
[mysqld]
read-only
2. web程序写的指向从库 (读指向从库)程序或者代理
3. 让从库只能读,不能写
35. 主从故障原因和解决方案
1. 从库已经有一个库,但是主库又创建了同名字的库,那么就冲突了
解决方法1:
stop slave;
set global sql_slave_skip_counter = 1;
start slave;
解决方法2:
根据错误号跳过指定的错误
slave_skip_errors = 1032,1062,1007
2. mysql 连接慢的时候,加这个参数 skip-name-resolve
36. 让mysql从库记录binlog方法
1. 把当前的从库还要作为其他的从库的主库,也就是级联同步。
2. 把从库作为备份服务器时,需要开启binlog
做法:
log-slave-update
log-bin=mysql-bin
expire_logs_days = 7 #find /data/mysql/ -type f -name "mysql-bin.000*" -mtime +7|xargs rm -f
37. 一主多从。如果主库宕机了。mysql服务挂了或者服务器宕机
1. 登陆从库 show processlist; 看两个线程的更新状态
2. 登陆从库 查看 /application/mysql/data/master.info
确保更新完毕,看哪个是更新最多内容的(POS最大的)。就把它作为主库处理。
或者利用半同步功能,直接选择做了实时同步到这个从库,太子的位置。
3. 确保所有relay log全部更新完毕
在每个从库执行stopslave io_thread; show processlist;
查看Has read all relay log; 表示从库更新都执行完毕了
4. 登陆 从库
stop slave;
reset master;
quit
5. 清理之前那些read-only 和授权表。
6. 进到数据数据目录,删除master.info relay-log.info
cd /application/mysql/data
rm -f master.info relay-log.info
7. 提升从库为主库
开启:log-bin = mysql-bin
如果存在log-slave-updates read-only等一定要注释它
到此为止,提升主库完毕
8. 如果主库服务器没有宕机,需要去主库拉取binlog 补全提升为主库的从库的数据。
9. 其它从库操作
已检查(同步user rep都存在)
登陆从库
stop slave;
change master to master_host ='192.168.11.100'
start slave;
show slave status\G
=========================主库宕机切换成功。
10. 修改程序配置文件从数据库指向100
平时访问数据库用域名,则直接可以修改hosts解析
38. 主库和从库有计划的切换。
1. 主库锁表
2. 登陆所有的库查看同步状态,是否完成
39. 从库宕机了
1. 从做slave
直接灌数据:
stop slave;
gzip -d xxxxx.sql.gz
mysql -uroot -p'112233' < xxxxx.sql
change master to master_host='192.168.11.100',master_user='rep',
master_password='112233',master_log_file='mysql-bin.00001',
master_log_pos=62358;
start slave;
show slave status\G
40. 两台mysql互为主备
41. mysql数据库增量恢复大总结
1. 人为sql造成的误操作
2. 全备和增量
3. 恢复时建议对外停止更新
4. 恢复全量,然后把增量日志中有问题的sql语句删除,恢复到数据库
增量恢复的核心思想:
1. 流程制度控制,防止问题发生。如果不做,面临服务和数据,鱼和熊掌不可兼得。
2. 延迟备份来解决。或者通过监控,白名单,黑名单机制。
3. 业务需求容忍度,可量化的目标,根据需求选择停库或者锁表或者容忍丢失部分数据。
42. 主从同步出现延迟,(从库记录慢了)怎么解决?
43. 数据库的读写分离软件,mysql-proxy amoeba;
44. mysql-mmm架构的高可用软件。
45. mysql半同步应用
46. mysql+heartbeat+brbd 高可用。
http://oldboy.blog.51cto.com/2561410/1240412
47. xtrabackup 物理热备份
48. 错误日志:记录mysql服务进程mysqld在启动/关闭/运行过程中错误信息
[mysql_sage]
log-error=/data/application/mysql/localhos.err
49. 查询日志 :分为两类 普通查询日志 和 慢查询日志
1. 普通查询日志参数:记录客户端连接的信息和执行的sql语句信息
mysql> show variables like 'general_log%';
+------------------+---------------------------------------+
| Variable_name | Value |
+------------------+---------------------------------------+
| general_log | OFF |
| general_log_file | /application/mysql/data/localhost.log |
+------------------+---------------------------------------+
2. 慢查询日志:记录执行时间超出制定值(long_query_time)的sql语句
long_query_time = 1
log-slow-queries = /data/application/mysql/slow.log
log_queries_not_using_indexes
3. 二进制日志 :记录数据被修改的相关信息
mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin | ON | #记录binlog
| log_bin_trust_function_creators | OFF | #临时不记录binlog
+---------------------------------+-------+
50. binlog 日志三种模式
1. Statement Level模式 (默认模式)
mysql> show variables like '%binlog_format%';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
2. Row Level模式
用下面的命令查看该模式下的日志文件记录:
mysqlbinlog --base64-outpout=decode-rows -v mysql-bin.000016
3. Mixed 混合模式(前两种模式的结合)
修改方式:
1. 配置文件/etc/my.cnf
log-bin=mysql-bin
#binlog_format="STATEMENT"
#binlog_format="ROW"
#binlog_format="MIXED"
2. 运行时,在线修改立即生效
mysql> set SESSION binlog_format = 'MIXED';
全局生效
mysql> set GLOBAL binlog_format = 'MIXED';
51. mysql服务存储引擎
1. 分类:
MyISAM 和 InnoDB
不同的引擎功能,占用的空间大小,读取性能等可能有区别
mysql> show create table stu\G
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`name` char(20) DEFAULT NULL,
`dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2. [root@localhost]#ll /application/mysql/data/mysql
user.frm #文件保存表的定义
user.MYD #保存表的数据
user.MYI #表的索引文件
[root@localhost /application/mysql/data/mysql]# file user.frm
user.frm: MySQL table definition file Version 9
[root@localhost /application/mysql/data/mysql]# file user.MYD
user.MYD: Hitachi SH big-endian COFF executable, not stripped
[root@localhost /application/mysql/data/mysql]# file user.MYI
user.MYI: MySQL MISAM compressed data file Version 1
3. MyISAM引擎的特点
4. MyISAM引擎适用的生产业务场景
5. MyISAM引擎调优精要
6. InnoDB引擎的特点
7. InnoDB引擎适用的生产业务场景
8. InnoDB引擎
9. InnoDB引擎
52. 事务介绍
1. 事务四大特性:
原子性 一致性 隔离性 持久性
2. 事务的开启
start transcation #开启事务
rollback #回滚事务
commit #提交事务
mysql> show variables like '%autocom%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
set autocommit=OFF
set autocommit=ON
53. 创建后引擎的更改
alter table huang ENGINE=INNODB;
alter table huang ENGINE=MyISAM;
批量修改mysql引擎:
mysql_convert_table_format --user=root --password=112233 -- engine=MyISAM huang stu;
54. heartbeat介绍与作用
别名:
heartbeat2 默认使用这条命令添加VIP
ifconfig eth0:1 192.168.11.200/24 up
ifconfig eth0:1 192.168.11.200/24 down
辅助ip:
keepalved 和 heartbeat 用这个命令添加:
ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
ip addr del 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
注意:ip add 可以查看包括别名和辅助ip,用ifconfig 不能查看辅助ip 的情况
55. heartbeat 脚本默认目录
常用的配置文件有三个,分别为
ha.cf 参数配置文件
authkey 认证文件 高可用服务器之间个呢进对端的authkey ,对对端进行认证
haresource 资源配置文件,如配置启动ip 资源 及脚本程序 服务等
启动脚本:/etc/init.d
资源目录:/etc/ha.d/resource.d/ 如果以后自己开发程序,就放在这个地方,然后再haresource文件之间调用
56. heartbeat 快速部署搭配过程
1. ip规划和配置
master: eth0 10.0.0.7 eth1 10.0.10.7 VIP 10.0.0.17
slave: eth0 10.0.0.8 eth1 10.0.10.8 VIP 10.0.0.18
2. 配置主机名和hosts
#data-1-1
hostname data-1-1
sed -i 's#HOSTNAME=moban#HOSTNAME=data-1-1#g' /etc/sysconfig/network
#data-1-2
hostname data-1-2
sed -i 's#HOSTNAME=moban#HOSTNAME=data-1-2#g' /etc/sysconfig/network
sed -i '/^10.0.0/d' /etc/hosts #删除原来的10.0.0.*
uname -n 主机名一定要跟这个命令得出的结果一样
3. 配置服务器的心态连接,让两台的网卡eth1 直连:
#data-1-1
/sbin/route add -host 10.0.10.8 dev eth1
echo '/sbin/route add -host 10.0.10.8 dev eth1 >>/etc/rc.local'
#data-1-2
/sbin/route add -host 10.0.10.7 dev eth1
echo '/sbin/route add -host 10.0.10.7 dev eth1 >>/etc/rc.local'
4. 安装Centos 6.5 heartbeat3.0软件
#下载并安装epel 包
mkdir -p /data/tools
cd /data/tools
wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpm -qa |grep epel
#安装heartbeat
yum -y install heartbeat*
cd /usr/share/doc/heartbeat-3.0.4/
cp ha.cf haresources authkeys /etc/ha.d/
#查看配置文件ha.cf
cat /etc/ha.d/ha.cf
#the start by huang
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local10
keeplive 2
deadtime 30
warntime 10
initdead 120
#bcast eth1
mcast eth1 255.0.0.7 694 1 0
auto_failback on
node data-1-1
node data-1-2
crm on
#the end by huang
#配置文件 authkeys
chmod 600 /etc/ha.d/authkeys #不改权限 ,heartbeat 服务报错无法开启服务
cat /etc/authkeys
auth 1
1 sha1 key-for-sha1-any-text-you-want
#配置文件haresources
#huang services
#10.0.0.17 www.etiantian.org
data-1-1 IPaddr::10.0.0.17/24/eth0
#data-1-1 IPaddr::10.0.0.17/24/eth0 httpd
#10.0.0.18 bbs.etiantian.org
data-1-2 IPaddr::10.0.0.18/24/eth0
配置hosts
cat >>/etc/hosts <
10.0.10.8 data-1-2
eof
5. 启动heartbeat 服务
chkconfig iptables off
setenforce 0
sed -i 's#SELINUX=enforcecing#SELINUX=disable#g' /etc/selinux/config
/etc/init.d/heartbeat start
ps -ef |grep heartbeat
chkconfig heartbeat off
chkconfig drbd off
6. heartbeat实现web 服务高可用案例
详情请看word文档 “heartbeat 实际搭配过程”
57. DRBD介绍(实时数据同步,mysql的工具)
不同主机之间的基于块设备的镜像。
基于 beatheart 来搭建
Cetos6.5 快速部署drbd8.4:
1. 环境搭建
双网卡,双硬盘
2. 配置好ip
3. 对磁盘分区
#大于2T 硬盘 parted 分区
#data-1-1
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0 1024
parted /dev/sdb p
parted /dev/sdb mkpart primary 1025 2146
parted /dev/sdb p
#分区大小不同是有目的的,为后面扩容做准备
#对新添加的磁盘快速分区方法:
# echo -e "n\np\n1\n\n+10G\nn\np\n2\n\n+20G\nw" |fdisk /dev/sdb
# partprobe
两台机器都需要分区
4. 安装配置DRBD
下载地址:http://rpmfind.net/
mkdir -p /data/tools
cd /data/tools
wget -q http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
rpm -ivh elrepo-release-6-5.el6.elrepo.noarch.rpm
sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf
yum -y install drbd kmod-drbd84
yum install -y kernel-devel kernel-headers flex brdb84-utils kmod-drbd84
rpm -qa |grep drbd
5. 安装DRBD并加载内核
mkdir /data/tools -p
cd /data/tools
export LC_ALL=C
lsmod |grep drbd
modprobe drbd
echo "modprobe drbd >/dev/null 2>&1" >/etc/sysconfig/modules/drbd.modules
6. 配置文件drbd.conf
global {
#minor-count 64;
#dialog-refresh 5; #5 seconds
#dialog-ip-verififcation;
usage-count no;
}
common {
protocol C;
disk {
no-io-error detach;
no-disk-flushes;
no-md-flushes;
}
net {
sndbuf-size 512k;
#timeout 60; # 6 seconds (unit = 0.1 seconds)
#connect-int 10; # 10 seconds (unit = 1 seconds)
#ping-int 10; # 10 seconds (unit = 1 seconds)
#ping-timeout 5; # 500 ms (unit = 0.1 seconds)
max-buffers 8000;
uplug-watermark 1024;
max-epoch-size 8000;
# ko-cout 4;
#allow-two-primaries;
cram-hmac-alg "shal";
shared-secret "hdhwXes23sYEhart8t";
after-sb-Opri disconnect;
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
# data-integrity-alg "md5";
# no-tcp-cork;
}
syncer {
rate 330M;
al-extents 517;
}
}
resource data {
on data-1-1 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.7:7788;
meta-disk /dev/sdb2 [0];
}
on data-1-2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.8:7788;
meta-disk /dev/sdb2 [0];
}
}
7. 初始化drbd
drbdadm create-md data
drbdadm up data
cat /proc/drbd
8. 设置主,同步数据到对端
#data-1-1上执行,不能再data-1-2上执行
drbdadm -- --overwrite-data-of-peer primary data
9. 挂载写入数据
#data-1-1上执行
mkfs.ext4 -b 4096 /dev/drbd0
tune2fs -c -1 /dev/drbd0
mkdir /md1
mount /dev/drbd0 /md1
for n in 'seq 10';do /bin/cp /bin/cat /md1/huang$n;done
cat /proc/drbd
10. 备节点查看数据
drbdadm down data
mount /dev/sdb1 /mnt
ls /mnt
11. 备节点还原服务
umount /mnt
drbdadm up data
cat /proc/drbd
chkconfig drbd off
chkconfig heartbeat off
58. mysql高可用需求与架构 heartbeat 和 brdb 的结合使用。
1. 修改配置文件haresources
主节点:data-1-1 IPaddr::10.0.0.17/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4
备节点:data-1-1 IPaddr::10.0.0.17/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4
2.主备都启动 heartbeat
/etc/init.d/heartbeat stop
/etc/init.d/heartbeat start
3. 查看是否成功
ip add |grep 10.0.0
cat /proc/drbd
df -h
4. 演示主备切换(备节点接管大概一分钟时间)
主节点:/etc/init.d/heartbeat stop 或者reboot #主节点故障了
备节点:tail -f /var/log/ha-debug #查看接管过程。
5. 裂脑解决方法
a. 在从节点如下操作
modprobe drbd
drbdadm secondary data
drbdadm disconnect data
drbdadm -- --discard-my-data connect data
b. 在主节点上,通过cat /proc/drbd查看状态,如果不是WFConnection状态,需要手动连接
drbdadm connect data
6. /usr/share/heartbeat/hb_standby
/usr/share/heartbeat/hb_takeover local
7. 修改配置文件haresources
主节点:data-1-1 IPaddr::10.0.0.17/24/eth0 drbddisk::data Filesystem::/dev/drbd0::/data::ext4 mysql
cp /data/3306/mysql /etc/ha.d/resource.d/ #把mysql的启动脚本放在这个目录下
chmod +x /etc/ha.d/resource.d/mysql
8. 检查下所有的状态
a. ip add |grep 10.0.0.17
b. cat /proc/drbd
c. df -h
d. lsof -i :3306
9. 注意问题
my.cnf 里面的配置。指定的路径要一样、免得出现各种错误。
10. 故障后,修复后,主备切换回来
保证主的状态是 Secondary 再切回来
/usr/share/heartbeat/hb_takeover local
59. 网站很卡,很慢
1. 网站出问题,很慢 (数据库导致的)。
a. show full processlist;
mysql -uroot -p'112233' -e "show full processlist;"|grep -vi sleep
b. 慢查询语句(日志文件)
long_query_time = 1
log-slow-queries = /data/3306/slow.log
c. 发现大量的慢查询语句
explain select xxxxxxxxxxxxxxxxxxxxxxxxx
select SQL_NO_CACHE xxxxxxxxxxxxxxxxxxxxxxxxxxx
找到原来是没有索引引起的。
d. 查看表结构:show create table ad_oldbooy_detail\GBK
e. 查看条件字段列的唯一性
select count(distinct * ) from ad_oldboy_detail;
f. 解决方法(建立联合索引)
create index d_a_p on ad_oldbooy_detail(dateline,ader(20),pos(20));
2. 数据负载很高 (网页搜索导致的)
解决方案请看 ---企业面试题集合文档
60. mysql 数据优化思想和优化实践
1. 硬件优化
a. CPU 一台机器8-16颗CPU
b. 内存 32-64G 跑两个实例
c. 硬盘 数量越多越好。性能:ssd(高并发)>sas(普通业务)>sata(线下)
d. 网卡 多块网卡bond 以及buffer tcp 优化
2. 软件优化
操作系统:64位
软件:mysql 编译安装和优化
3. my.cnf里参数的优化
优化的幅度很小。大部分机构和SQL语句优化
思想: 监控 一边监控一边改参数
show global status\G
性能调优工具:mysqlreport 自动分析参数
http://www.day32.com/MySQL/tuning-primer.sh
4. SQL语句的优化
a. 索引优化
1)抓成慢SQL,配置my.cnf
long_query_time = 2
log-slow-queries = /data/3306/slow-log.log
2)慢查询日志分析工具---mysqlsla(建议用)
mysqldumpslow mysqlsla myprofi mysql-explain-slow-log mysqllogfilter
3)每天晚上0点定时分析慢查询,发到核心开发,DBA分析,高级运维 CTO的邮箱里。
b. 大的复杂的SQL语句拆分成多个小的sql语句
子查询 JOIN 连表查询 。
c. 数据库是存储数据的地方,但不是计算数据的地方
对数据计算应用类处理。都要拿到前端应用解决。禁止在数据库上处理
d. 搜索功能 like %老男孩%, 一般不要用mysql数据库
5. 架构的优化
a. 业务拆分:搜索功能 like %老男孩%, 一般不要用mysql数据库
b. 数据库前端必须要加cache 例如:mencached 用户登陆,商品查询
c. 某些业务应用使用nosql 持久化存储,例如:mencachedb,redis,ttserver.
粉丝关注,好友关系等等。
d. 动态的数据静态化。整个文件静态化,页面片段静态化。
e. 数据库的集群和读写分离。一主多从,双主多从。通过程序或者dbproxy 进行集群读写分离
f. 单表超过2000万。拆库拆表。
6. 流程制度,制度,安全优化
任何一次人为数据库记录的更新,都要走流程
a. 人的流程:开发-->核心开发-->运维或者DBA
b. 测试流程:内网测试-->IDC测试-->线上执行
c. 客户端管理,PHPMYADMIN
61. 运维是一场没有硝烟的战争。
http://blog.51cto.com/oldboy/1296694