• Mysql数据库--自学笔记--2


    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 :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_nameG;
           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服务器连接数据库的代码写法如下:
         <?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_nameG
        插入数据
            
    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 root@192.168.11.100:/tmp/
          
           最后把数据灌进去
             mysqldump -uroot -p'112233' </tmp/mysql_all.bak.sql.gz
        
        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 statusG
            
            如果下面两个参数都是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 statusG ,检查同步状态,并在主库进行测试更新。
                    
    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 statusG
            =========================主库宕机切换成功。
        
        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 statusG
            
    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 stuG
    *************************** 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 <<eof
          10.0.10.7 data-1-1
          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 p 1 +10G n p 2 +20G w" |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_detailGBK
           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 statusG
           性能调优工具: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
        


  • 相关阅读:
    OpenStack 对接 Ceph
    《Netty权威指南》(二)NIO 入门
    《Netty权威指南》(一)走进 Java NIO
    进程间通信 IPC(Inter-Process Communication)
    CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd
    CentOS7 下编译安装 Samba,什么是 SMB/CIFS 协议
    《Netty权威指南》目录
    CentOS7 下安装 NFS,Linux/Windows 作为客户端
    数据结构汇总
    Ceph 块设备
  • 原文地址:https://www.cnblogs.com/huanglinsheng/p/10030650.html
Copyright © 2020-2023  润新知