MYSQL配置:數據庫結構:庫.表.記錄 1、登陸及退出 mysql -u root exit 加密碼: mysqladmin -u root password 123456 mysql -u root -p 改密碼: mysqladmin -u root -p password 666666 2、查看 查看數據庫 show databases; 切換數據庫命令 use test; 查看錶: show tables; 查看錶結構 desc user; 3、建立與刪除 庫操做 create database stu; drop database stu; 表操做 create table user( name char(8) not null, age tinyint not null, xb char(3) not null, password char(16) not null default '123456', id char(18) not null, primary key (id)); drop table user; 4、記錄操做命令 查: select * from user; select * from user where name='xc'; 增: insert into user values( 'xc','17','w','000000','01' ); insert into user(name) values( 'xh'); 改: update user set xb='m' where name='xh'; update user set password=encrypt('111111') where name='xh'; 刪: delete from user where name='xh'; 受權: grant all on stu.user to wcg@localhost identified by '111111'; 刪除權限: revoke all on stu.user from wcg@localhost; 查看權限: show grants for wcg@localhost; 5、備份與還原 備份 mysqldump -u root -p stu>/opt/stu.bak mysqldump -u root -p --all-databases>/opt/all.bak mysqldump -u aaas -p yxbao_website>/mydir/aaa.sql 備份 還原 mysql -u root -p stu</opt/stu.bak mysql -u root -p </opt/all.bak mysql -u aaas -p qbxb_website<aaa.sql 還原 ------------------------------------------------------------ --------《數據操做》------ use mysql; 切換數據庫 select user,host,password from mysql.user; 查看數據 drop user ''@'localhost'; 刪除空用戶 update mysql.user set host='192.168.200.%' where user='root' and host='127.0.0.1'; 刷新 update user set password=password('123456') where user='root'; 刷新改密碼 flush privileges; 刷新MySQL的系統權限相關表 在當前用戶的家裏面: (局部須要手動輸入密碼) vim .my.cnf [client] user=root password=123456 host=localhost show engines; 查看引擎 Transactions: 事物的意思 XA: 分佈式事物 Savepoints: 存儲點 MyISAM 適用於寫少讀多的場景 適合作查詢,適合數據倉庫 InnoDB 適用於讀多寫多,支持事物 修0改數據庫默認引擎: vim /etc/my.cnf #default-storage-engine=MYISAM default-storage-engine=INNODB MYISAM 寫少讀多 應用於電子圖書館 (表級別) .frm :表結構 .myd :表數據 .myi :表索引 Innodb 讀多寫多 應用於電子商城以及各類應用 (表級別) .frm :表結構 .ibd :表空間(數據和索引) .opt :字符集和排序規則 innodb_file_per_table=1 每一個表都有一個表空間 show table status like 'user' \G 查看錶狀態 能夠查看一個表的存儲引擎是什麼 變量: 服務器變量: show global variables; (查看全局變量) show global variables like '%innodb'; 狀態變量: show global status; select database (); 查看當前正在實用的哪一個庫 -------------------------- mysql -u root -p123456 -e 'create database c17' -e 參數,在shell命令中直接操做(調用)mysql 命令 mysql -u root -p123456 -D c17 -e 'create table user(id char(16) not null)' -D 參數,在shell環境中直接登陸到指定的庫 ----------------------------------------------------------------- create database c15 default character set utf8; (建立庫的時候加一個默認字符集,就是實現往裏面差中文了) default-character-set=utf8 設置默認字符 經過mysql命令修改: 修改數據庫的字符集 mysql>use mydb mysql>alter database mydb character set `utf8` collate `utf8_general_ci`; show 建立數據庫指定數據庫的字符集 mysql>create database mydb character set `utf8` collate `utf8_general_ci`; mysql>create database mydb character set `gbk` collate `gbk_chinese_ci`; 經過配置文件修改: 修改/var/lib/mysql/mydb/db.opt default-character-set=latin1 default-collation=latin1_swedish_ci 爲 default-character-set=utf8 default-collation=utf8_general_ci 重起MySQL: show character set; 字符集查看 show collation; 查看排序規則 cd /usr/local/mysql/data/mydb vim db.opt (查看修改的字符集) ------------------------------------------------------- 1.經過MySQL命令行修改默認字符集: mysql> set character_set_client=utf8; mysql> set character_set_connection=utf8; mysql> set character_set_database=utf8; mysql> set character_set_results=utf8; mysql> set character_set_server=utf8; mysql> set character_set_system=utf8; mysql> set collation_connection=utf8; mysql> set collation_database=utf8; mysql> set collation_server=utf8; 查看: mysql> show variables like 'character_set_%'; show variables like 'collation_%'; 另外一臺服務器導入已有數據庫: 本臺服務器yum安裝 vim /etc/my.cnf default-character-set=utf8 default-collation=utf8_general_ci [client] default-character-set=utf8 -------------------《表操作》------------------ 1、鍵與索引 1、主鍵:惟一,非空,只有一個 惟一鍵:惟一,能夠爲空,多個 2、索引: show indexes from user;(查看) (表名)(字段名) create index kc_index on kecheng(kc); (建立) (自定義索引名) drop index kc_index on kecheng; (刪除) 2、建立、刪除、修改 1、建立 create table user(id int unsigned not null auto_increment,name varchar(30) not null,age tinyint not null,primary key(id),unique key(name),index(age)); (unsigned 正整數) (unique 惟一鍵 ) (index 索引) auto_increment(自動編號功能) (整數類型,無符號(正數)、非空、主鍵或惟一鍵) select_insert_id0; (最後一個插入id號) show table status like 'user' \G; (查看錶狀態) create table kecheng(kcid tinyint unsigned not null auto_increment primary key,kc varchar(50) not null) engine=innodb; create table u1 select * from user whwere id<=2; (導入數據同樣,表結構不同) create table u2 like user; (導入表結構同樣數據不同) 2、修改 增長、修改、刪除字段 alter table user add kcid tinyint unsigned not null; alter table user change kcid kid tinyint unsigned not null; 增長、修改、刪除索引 alter table user add indx kcid(kcid); alter table user drop kcid; (刪除) 修改表名字 alter u1 rename to nu ll; 修改表引擎 alter table user engine=innodb; ------------------------------------------------------------ mysql環境導入數據庫 \! mysql -uroot c15</root/c15.sql -------------------------------------------------------- 單表查詢(簡單查詢) select * from c15.gangwei; select name,gongzi from c15.gangwei; select * from c15.gangwei where name='王力邦'; select distinct gangwei from c15.gangwei; (去除重複的,返回惟一不一樣值) select name as '姓名',gongzi as '工資' from gangwei where gongzi>5000; ------布爾表達式: = Equal to (等於) <> aka != Not equal (不等於) <=> NULL,safe equal to (等於空) < Less than (不到) <= Less than or equal to(小於或等於) > Greater than (大於) >= Greater than or equal to (大於或等於) --------邏輯表達式: Not aka ! Logical NOT 邏輯不 AND aka && Logical AND 邏輯和 OR aka || logical OR 邏輯或 例子: select * from gangwei where gangwei='運維' or gangwei='售前'; select * from gangwei where gangwei !='運維'; -------擴展表達式: BETWEEN Exists in specified range (存在於指定範圍) IN Exists in specified set (存在於指定的組) IS NULL Is a NULL value (是一個空值) IS not null Is not a NULL value (不是一個NULL值) LIKE Wildcard nmath (通配符nmath) 例子: select * from gangwei where test3 between 15 and 30; select * from c15.gangwei where gangwei in ('運維','坐家'); select * form gangwei where gangwei is not null; ------------------------ #order by 子句: select * from user where gangwei is not null order by gongzi desc; asc 升序 desc 降序 #limit 子句: select name as '姓名',gongzi as '工資' from gangwei where gongzi>500 limit 5,5; (limit 5,5 顯示去掉前5個,從第六行顯示5行) select * from info order by id desc limit 1; (顯示最後插入的) #聚合: avg(平均值) sum(總和) min(最小) max(最大) count(數) select avg(test1) as '平均工資' from gamgwei; select sum(test1) as '總分' from gangwei; select min(test3) as '總分' from gangwei; select max(test3) as '總分' from gangwei; #分組 select avg(test1) as '平均分',gangwei as '崗位' from user group by gangwei; select avg(test1) as '平均分',gangwei as '崗位' from user group by gangwei having avg(test1)>5; select avg(gongzi) as '平均工資', gangwei as '崗位' from user group by gangwei; select avg(gongzi) as '平均工資', gangwei as '崗位' from user group by gangwei having avg(gongzi)>3000; having (有的意思) 比如過濾一下的意思 ---------------------增、刪、查-------------------------- 查詢: 1、建立單表導入另外一個表(簡單查詢) create table info select * from gangwei; create table info2 like gangwei; 2、多表查詢 天然鏈接: select g.name,g.gangwei,i.class,i.age from gangwei as g,info as i where g.name=i.name; 外鏈接: 左外鏈接 select g.id,g.name,g.gangwei,i.class,i.age from gangwei as g left join info as i on g.name=i.name; 右外鏈接 select g.gangwei,i.id,i.name,i.class,i.age from gangwei as g right join info as i on g.name=i.name; 3、子查詢(嵌套查詢) select * from info where age>(select avg(age) from info); select * from info where name in (select name from gangwei); 4、聯合查詢 (select name,gongzi from gangwei)union(select name,.age from info) 增刪改: select last_insert_id(); create table infobak like info; (把另外一張表的數據你導入新建的一張表裏) insert into infobak(name,class,age,xulei) select nmae,class,age,xulei from info where age>=20; truncate table info; (不能加條件,初始化表的意思) ------------------------------------------------------------------------------------------------------------------------------------- 《用戶權限管理》 1、用戶管理: 1、建立 create user bbsroot@'%' identified by '123456'; select user,host,password from mysql.user; (查看) flush privileges; (刷新受權表) 2、刪除 drop user bbsadmin@localhost 3、修改 rename user bbsroot@'%' to bsadmin@localhost; select user(); (查看當前登陸用戶) update user set password=password('formal') where user='yxjr123456@A'; 刷新改密碼 2、權限管理 1、權限級別 user: 用戶帳號、全局權限 host: 合併到user表 db: 數據庫權限 tables_priv: 表權限 columns_priv: 字段權限 procs_priv: 存儲過程、存儲函數權限 use mysql; desc user; (查看) 2、權限的種類 是一張表 3、受權 create user aaas@'%' identified by 'yxjr123456@'; grant all on *.* to aaas@'%'; show grants for root@localhost; grant update(class) on c15.info to wcg@localhost; grant all on *.* to formal@'%' identified by 'yxjr123456@RAK'; 4、撤銷權限 revoke all on *.* from wcg@localhost; 5、破解密碼 vim /etc/init.d/mysql $exec 這下面加 --basedir=/usr --user=mysql --skip-grant-table>/dev/null 2>&1 & --skip-network (跳過遠程登陸) --skip-name-resolve (屏蔽名字解析,加快用戶登陸速度) ---------------------------------------------------------------PS PS是LINUX下最經常使用的也是很是強大的進程查看命令 //如下這條命令是檢查java 進程是否存在. ps -ef |grep java 下面對命令選項進行說明: -e 顯示全部進程。 -f 全格式。 ps e 列出程序時,顯示每一個程序所使用的環境變量。 ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關係 grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是全部用戶。 ps -ef | grep httpd : 檢查httpd進程是否存在 ------------------------《日誌管理》----------------------------- show global variables like '%log%'; 1、錯誤日誌 1、記錄mysql啓動、中止過程 二、同步過程 /var/log/mysqld.log 目錄位置 一臺繁忙的mysql服務器,若是開啓日誌功能會產生大量的I/O,嚴重影響mysql的性能,把日誌和數據分別存放在(不存放在一個硬盤中) 能夠更改目錄位置 vim /etc/my.cnf log-error=/var/log/mysqld.log -----2、通常日誌------ 默認關閉, 推薦關閉 general_log |OFF general_log_file |/var/run/mysqld/mysqld.log -----3、慢查詢日誌----- slow-query-log mysql.cnf 裏面加一條就開啓了 long_query_time |10.000000 十秒之外的就是慢性查詢了 slow_query_log |OFF 默認是關閉的 slow_query_log_file |/var/run/mysqld/mysql-slow.log (/usr/local/mysql/data/localhost-slow.log二進制安裝目錄) vim /etc/my.cnf 開啓 slow-query-log log-slow-queries = /var/lib/mysql/mysql-slow.log long_query_time = 2 超過多少秒 -----4、二進制日誌文件------ 1、作數據庫主從複製 2、即時點還原,能夠把數據還原到數據崩潰的那一刻 1、開啓 vim /etc/my.cnf (開啓二進制日誌) log-bin=mysql-bin 1) log-bin-index=/var/run/mysqld/mysql-bin.index 生成目錄有哪些二進制文件 2) log-bin=/var/run/mysqld/mysql-bin (實際工做中這個這個目錄應該是一個掛載點,由於在不一樣硬盤上比較安全)(更改這個目錄的時候必須改 屬主數組) 3)sync-binlog=1 同步二進制文件,每隔多長時間、每隔多少事件往硬盤裏寫一次 2、格式 binlog_format statement 保存命令,可以引發數據庫變化的 row 保存的變化行 mixed 混合格式 vim /etc/my.cnf binlog_format=mixed 3、查看 show master status; 當前正在使用哪一個二進制文件 show binlog events in 'mysql-bin.000002'; 當前二進制文件哪些事件 cd /usr/local/mysql/data mysqlbinlog mysql-bin.000003 查看 mysqlbinlog --start-position=106 --stop-position=187 mysql-bin=000002>/opt/info.bak 導出來 mysqlbinlog -hlocalhost -uroot -p mysql-bin.000001>1.sql 導出來保存sql格式恢復 106 前叫 二進制文件頭 at 106 開頭 end 187 結束 show binary logs; 查看全部二進制文件 mysqlbinlog mysql-bin.000003 查看 4、滾動 service mysqld restart flush logs; 5、刪除 show binary logs; purge binary logs to 'mysql-bin.000003' 刪除000003 之前的 --------5、《事務》----------------------------- INNODB特徵: 多用戶,多程序,多線程,併發 ACID就是:原子性(Atomicity)、一致性(Consistency)、 隔離性(Isolation)、持久性(Durabilily) show tables status \G; (查看錶狀態) show global variables like '%auto%'; 查看一下自動提交 set autocommeit=0; (關閉自動提交) start transaction; 啓動事務日誌(操做數據庫以前必須作) 啓動日誌之後全部操做將會被記錄下來 delete from info where id=18; (假如誤操做刪了表裏面的東西) rollback; 回滾 (能夠回覆誤操做刪除的東西) commit; 提交 (提交之後的纔是保存的,作完操做必須作) savepoint full; 保存當前表徹底數據 savepoint no16; 保存前16數據,精確值 savepoint no17; rollback full; 恢復徹底數據的 rollback no16; 恢復精確的 show global variables like '%log%'; 查看一下事務日誌的目錄 事務日誌和數據日誌在同一個目錄下 cd /avr/lib/mysql ib_logfile0 ib_logfile1 裏面爲何有兩個文件呢,由於第一個寫滿了第二個接替第一個工做,第二個寫滿了第一個接替第二個工做,循環工做,防止出現工做停頓。 --------------------6、事務日誌------------------------------ innodb_flush_log_at_trx_commit 0: 每秒同步,並執行磁盤flush操做; 1:每十五同步,並執行磁盤flush操做; 2:每事務日誌,但不執行磁盤flush操做; 工做中用 1 ===================================================================== 《備份與恢復》 1、備份類型: 熱備:在數據庫正在運行狀況下進行備份。 溫備:服務正在運行,可讀不可寫時備份。 冷備:在數據庫中止的狀況下進行備份。 物理備份:直接把數據文件拷貝出去 邏輯備份:mysqldump 邏輯備份。備份文件是語句是邏輯備份。 徹底備份:一次完整備份 列如all 增量備份:不包含上一次備份的數據,只備份增長的一部分 優勢:備份數據量小備份速度快。佔用空間小 缺點:還原速度慢 得一個一個的還原,還原慢。並且很麻煩 差別備份:包含上一次備份的數據 優勢:備份數據多,速度比較慢。佔用空間大。 缺點:還原效率高。 2、 備分內容:數據文件,配置文件,二進制日誌,事務日誌。 備份工具: ======mysqldump :==== flush tables with read lock; 把表變成只讀表,防止備份出來的數據不一致 unlock tables; 解除讀鎖 flush logs; 滾動日誌(二進制) man mysqldump: --lock-all-tables 若是指定庫中的表類型均爲INNODB,可以使用 --single-transaction啓動熱備,不要和--lock-all-tables 一塊兒使用 --flush-logs --master-data={0|1|2} 0:不記錄二進制日誌文件及路位置; 1:以CHNAGE MASTER TO 的方式記錄位置,可用與恢復後直接啓動從服務器; 2:以CHANGE MASTER TO 的方式記錄位置,默認爲被註釋; 備份 mysqldump -u root -p --lock-all-tables --flush-logs --master-data=2 --events --all-databases>/opt/all-`date +%F-%H-%M-%S`.sql 還原 mysql -uroot -p </opt/all-all-2015-05-20-11-14-03.sql flush-logs; show binary logs; show binlog events in 'mysql-bin.000002'; (查看所須要還原的事件) 二進制日誌備份 備份 mysqlbinlog --start-position 120 --stop-position 907 mysql-bin.000009>/opt/9.sql 還原 mysql -uroot -p</opt/binlog-bak-2015-05-20-11--31.sql 還原時關閉二進制日誌,完成後開啓 缺點: 1、可能會引發浮點數據丟失精度; 2、備份數據容量大於原始數據(壓縮後大大節省空間) 3、速度慢,不適合對大數據庫作徹底備份; -------《第二種備份方法》 select * into outfile '/opt/back15' from info; 一般適用於備份一張表 create table info1 like info; load data infile '/opt/back15' into table info1; ---------《LVM 邏輯卷備份》 pvcreate /dev/sdb /dev/sdc vgcreate vg0 /dev/sdb /dev/sdc lvcreate -L 500M -n lv0 vg0 mkfs -t ext4 /dev/vg0/lv0 mkdir /mnt/mysqldata 掛載 mount -a vim /etc/my.cfg [mysqld] datadir=/mnt/mysqldata (更改一下位置) log-bin=mysql-bin service mysqld restart chown -R mysql.mysql /mnt/mysqldata 1、數據文件要在邏輯捲上; 2、此邏輯卷所在卷組必須有足夠空間使用快照卷; 3、數據文件和事務日誌要在同一個邏輯捲上; 1、打開會話,施加讀鎖,鎖定全部表; flush tables with read lock; flush logs; show master status; (查看當前二進制的位置) 2、經過另外一個終端,保存二進制日誌文件及相關位置信息; mysql -uroot -p -e 'show master status \G'>/path/to/master.info; 例:mysql -uroot -p -e 'show master status \G'>/opt/binlog.info 3,建立快照 lvcreate -L# -s -p r -n LV_NAME /path/to/source_lv 例:lvcreate -L 50M -s -p r -n lv0-back /dev/vg0/lv0 (-s snapshop 快照卷的意思) (-p 權限)(-r讀 -w寫) 4、釋放鎖 unlock tables; 5、掛載快照卷 備份 mkdir /mnt/lv0-bak mount /dev/vg0/lv0-bak /mnt/lv0-bak 備份 cp -ra * /opt/bakc15 ( -a 保留原有文件屬性) 6、刪除快照卷 unmont /mnt/lv0-bak lvremove /dev/vg0/lv0-bak 7、增量備份二進制 insert into info(age) values(110); (增長一個備份沒有的) 備份二進制 mysqlbinlog mysql-bin.000002>/opt/2.sql 關閉二進制文件 刪除而後還原 service mysqld restart 8、還原 cd /opt/bakc15 cp -ra * /mnt/mysqldata mysql<2.sql (二進制還原) ------------------------------------------------------------------ XTRAbackup 完整備份 innobackupex --user=root /opt 備份到哪裏 進入的opt下備份的目錄 cat xtrabackup_binlog_info (二進制日誌保存的位置) mysqlbinlog mysql-bin.000004 (保存位置那個日誌) innobackupex --apply-log /opt/2015-05-24_15-28.11 敲完上面的這一條必須敲,完善上面配置的 mysqlbilog --start-position=106 mysql-bin.000004>/opt/bakbinlog (備份二進制文件) (恢復) innobackupex --copy-back /opt/2015-05-24_15-28-11 chown -R mysql.mysql * (恢復以後屬=主數組權限更改成原來的mysql) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- lower_case_table_names=1 (不區分大小寫) <<MySQL查看和修改wait_timeout>> 1、全局查看wait_timeout值 [plain] view plaincopyprint? mysql> show global variables like 'wait_timeout'; 2、修改全局wait_timeout值 [plain] view plaincopyprint? set global wait_timeout=28800; 或 修改 /etc/mysql/my.cnf 添加 wait_timeout= 432000 默認值是28800秒(即默認8小時),修改成432000 單位爲毫秒; 3、查看修改以後的值 ----------------------------------------------------------------------------------------- 設置新的MySQL最大鏈接數爲200: MySQL> set GLOBAL max_connections=200; 或 vim /etc/my.cnf max_connections=1500; 《如何查看mysql數據庫鏈接數和內存佔用》 命令: show processlist; 或 mysqladmin -uadmin -p -h10.140.1.1 processlist 若是是root賬號,你能看到全部用戶的當前鏈接。若是是其它普通賬號,只能看到本身佔用的鏈接。 show processlist;只列出前100條,若是想全列出請使用show full processlist; mysql> show processlist; 命令: show status; 命令:show status like '%下面變量%'; Aborted_clients 因爲客戶沒有正確關閉鏈接已經死掉,已經放棄的鏈接數量。 Aborted_connects 嘗試已經失敗的MySQL服務器的鏈接的次數。 Connections 試圖鏈接MySQL服務器的次數。 Created_tmp_tables 當執行語句時,已經被創造了的隱含臨時表的數量。 Delayed_insert_threads 正在使用的延遲插入處理器線程的數量。 Delayed_writes 用INSERT DELAYED寫入的行數。 Delayed_errors 用INSERT DELAYED寫入的發生某些錯誤(可能重複鍵值)的行數。 Flush_commands 執行FLUSH命令的次數。 Handler_delete 請求從一張表中刪除行的次數。 Handler_read_first 請求讀入表中第一行的次數。 Handler_read_key 請求數字基於鍵讀行。 Handler_read_next 請求讀入基於一個鍵的一行的次數。 Handler_read_rnd 請求讀入基於一個固定位置的一行的次數。 Handler_update 請求更新表中一行的次數。 Handler_write 請求向表中插入一行的次數。 Key_blocks_used 用於關鍵字緩存的塊的數量。 Key_read_requests 請求從緩存讀入一個鍵值的次數。 Key_reads 從磁盤物理讀入一個鍵值的次數。 Key_write_requests 請求將一個關鍵字塊寫入緩存次數。 Key_writes 將一個鍵值塊物理寫入磁盤的次數。 Max_used_connections 同時使用的鏈接的最大數目。 Not_flushed_key_blocks 在鍵緩存中已經改變可是還沒被清空到磁盤上的鍵塊。 Not_flushed_delayed_rows 在INSERT DELAY隊列中等待寫入的行的數量。 Open_tables 打開表的數量。 Open_files 打開文件的數量。 Open_streams 打開流的數量(主要用於日誌記載) Opened_tables 已經打開的表的數量。 Questions 發往服務器的查詢的數量。 Slow_queries 要花超過long_query_time時間的查詢數量。 Threads_connected 當前打開的鏈接的數量。 Threads_running 不在睡眠的線程數量。 Uptime 服務器工做了多少秒 --------------------------------------------------------------------------------------- log_bin_trust_function_creators=true 解決(mysql)包查詢太大 說明: 1、項目剛開始運行時是正常的,能夠正常訪問,但是運行了一段時間就報錯 2、查詢下設置最大值 SHOW VARIABLES LIKE '%max_allowed_packet%'; 三、修改vim /etc/my.cnf max_allowed_packe=16384 應用: truncate table 表名; 恢復id值從1開始