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 \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服務器鏈接數據庫的代碼寫法以下:
     <?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. 索引
    主鍵索引
方法1、
    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)  是字段普通索引。    
    優化:在惟一值多的列上建索引查詢效率高。    
    
方法2、
    建立好表後,忘記加索引了:
    先把原來的刪除主鍵:
      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 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 <<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\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
    


php

相關文章
相關標籤/搜索