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