1. Mysql 管理命令 幫助? HELP
1.1查看mysql狀態信息
show processlist; 查詢當前連接進程
show status 查看當前會話的數據庫狀態信息
show global status; 查看整個數據庫運行狀態信息,很重要的分析並做好監控
show processlist; 查看正在執行的sql語句,
show full processlist 查看正在執行的完整sql語句,
set global key_buffer_size=32777218 不重啓數據庫調整參數,臨時生效
show variables;查看數據庫的參數信息,如my.cnf中參數是否生效
1.2修改mysql字符集爲UTF-8的方法:
show variables like "%char%"
在/etc/my.cnf對應如下配置段加入相應命令
[clinet]
字段加入default-character-set=utf8 客戶端生效
[mysqld]
字段加入character-set-server=utf8
[mysql]
字段里加入default-character-set=utf8 本地生效
然後重啓mysql服務
查詢字符集文件
show character set;
1.3解決mysql亂碼的問題?
方法1:
1. 檢查建表語句,判斷字符集類型show create table test_t0;
2. 設置字符集set names latinl;
方法2:
導入數據的時候指定符字符
mysql -uroot -p123456 --default-character-set=latin1 discuz</backup/discuz.sql
方法3:
在my.cnf文件中加入字符集
[mysqld]
default-character-set=latinl 適合5.5以前
character-set-server=latinl 適合5.5以後
不亂碼的思想,linux ,客戶端,服務器端,庫,表,程序都統一字符集,中英文環境儘量使用UTF8
1.4 mysql的歷史命令保護
vi /root/.mysql_bistory # 創建mysql歷史命令
ln -s dev/noull > mysql_history # 保戶命令歷史,創建成空文件
系統歷史命令清除 bashrc history -c
1.5 Mysql遠程管理 mysql -uroot -p -h 192.168.1.100
mysql交互式 mysql -uroot -p123456 -e “show databases;”
Mysql安全優化
刪除空用戶和多餘用戶
drop user 'username'@'host'
刪除空用戶
drop user ' '@'host'
1.6 mysql鎖表
5.1版本: flush tables with read lock
5.5版本: flush table with read lock
解鎖:
解鎖跟系統的兩個變量值有關,自動解鎖時間
Wait_timeout = 28800
Interactive_timeout = 28800
1小時默認3600秒 8小時*3600秒=28800秒 24小時共86400秒
Show variables like “%timeout%”
1.7 數據庫文件路徑
mysql> show variables link '%datadir%';
2.Mysql的升級
官方升級網址
https://dev.mysql.com/doc/refman/5.5/en/upgrading.html
As part of the "Logical Upgrade", I had to add the --flush-privileges option when dumping because mysql didn't recognise the newly created users when restoring views. Additionally I added --triggers for completeness.
mysqldump --add-drop-table --routines --events --triggers --flush-privileges --all-databases --force -uroot -p > mysql_backup.sql
3. Mysql SQL語句(DDL DML DCL 語言)
**SQL語句常見的分類**
DDL 數據定義語言(CREATE ALTER DROP)
DML 數據操作語言(SELECT INSTER DELETE UPDATE)
DCL 數據控制語言(GRANT REVOKE COMMIT ROLLBACK)
結構化查詢語言(Structured Query Language)簡稱SQL(發音:/ˈes kjuː ˈel/ "S-Q-L"),是一種特殊目的的編程語言,是一種數據庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係數據庫系統;同時也是數據庫腳本文件的擴展名。
一:數據查詢語言(DQL:Data Query Language):
其語句,也稱爲“數據檢索語句”,用以從表中獲得數據,確定數據怎樣在應用程序給出。保留字SELECT是DQL(也是所有SQL)用得最多的動詞,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。這些DQL保留字常與其他類型的SQL語句一起使用。
二:數據操作語言(DML:Data Manipulation Language):
其語句包括動詞INSERT,UPDATE和DELETE。它們分別用於添加,修改和刪除表中的行。也稱爲動作查詢語言。
三:事務處理語言(TPL):
它的語句能確保被DML語句影響的表的所有行及時得以更新。TPL語句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。
四:數據控制語言(DCL):
它的語句通過GRANT或REVOKE獲得許可,確定單個用戶和用戶組對數據庫對象的訪問。某些RDBMS可用GRANT或REVOKE控制對錶單個列的訪問。
五:數據定義語言(DDL):
其語句包括動詞CREATE和DROP。在數據庫中創建新表或刪除表(CREAT TABLE 或 DROP TABLE);爲表加入索引等。DDL包括許多與人數據庫目錄中獲得數據有關的保留字。它也是動作查詢的一部分。
六:指針控制語言(CCL):
它的語句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用於對一個或多個表單獨行的操作
mysql 的system命令
在命令行下,可以通過執行system命令,調用bash環境,比如
system ls /data/ 查看data目錄下的文件
3.1 Mysql 數據庫管理
select查詢命令 select *();
查看當前庫
mysql> select database();
查看當前用戶
mysql> select user();
查看當前時間
mysql> select now();
8.6.2.2 切換當前庫 use databases;
mysql> use mysql;
創建數據庫 Create Databas
create Database Discuz character set utf8
create database if not exists db_name 如果不存在就創建,不報錯
# 查詢數據庫創建的歷史命令
show create database discus;
查詢字符集文件
show character set;
# 創建數據庫並指定字符集
create database discuz default character set gbk collate gbk_chinese_ci;
create database discuz default character set utf8 collate utf8_general_ci;
數據庫重命名
RENAME database olddbname TO newdbname
查看數據庫 Show Databases
show databases;
show databases like ‘my%’;
查詢數據庫創建的歷史命令
show create database discus;
刪除數據庫 Drop Database
drop datebase [if exists] db_name;
注:刪除無法恢復
Drop database bbs; # 刪除bbs數據庫
3.2 Mysql 數據表操作
創建表:Create table tb_name (字段名 數據類型)
mysql> create table tutorials_tbl(
-> tutorial_id INT NOT NULL AUTO_INCREMENT,
-> tutorial_title VARCHAR(100) NOT NULL,
-> tutorial_author VARCHAR(40) NOT NULL,
-> submission_date DATE,
-> PRIMARY KEY ( tutorial_id )
-> );
+-----------------+--------------+------+-------+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+--------+------------+----------------+
| torial_id | int(11) | NO | PRI | NULL | auto_increment |
| tutorial_title | varchar(100) | NO | | NULL | |
| tutorial_author | varchar(40) | NO | | NULL | |
| submission_date | date | YES | | NULL | |
設置主鍵:
create table passwd2 (
id int(10) auto_increment PRIMARY KEY,
name char(20),
sex char(20)
);
例:create table students(name char(20) null,age char(10) null,sex char(10) null);
insert into students values('zhonglaing','23','man');
*************************
查詢表的建表語句
show create table student\G;
*************************
\G
send command to mysql server ,display result vertically 發送命令到mysql server,垂直顯示結果
生產創建表語句
CREATE TABLE `subject_comment_manager` (
`subject_comment_manager_id` bigint(12) NOT NULL auto_increment COMMENT '主鍵',
`subject_type` tinyint(2) NOT NULL COMMENT '素材類型',
`subject_primary_key` varchar(255) NOT NULL COMMENT '索材的主鍵',
`subject_title` varchar(255) NOT NULL COMMENT '索材的名稱',
`edit_user_nick` varchar(64) default NULL COMMENT '修改人',
`edit_user_time` timestamp NULL default NULL COMMENT '修改的時間',
`edit_comment` varchar(255) default NULL COMMENT '修改的理由',
`state` tinyint(1) NOT NULL default '1' COMMENT '0代表關閉,1代表正常',
PRIMARY KEY (`subject_comment_manager_id`),
KEY `IDX_PRIMARYKEY`(`subject_primary_key`(32)),
KEY `IDX_SUBJECT_TITLE` (`subject_title`(32)),
KEY `index_nick_type` (`edit_user_nick`(32),`subject_type`)
);
查看錶: show tables
查看庫中的表: show tables;
查年表中的結構: desc tabale_name;
刪除表: Drop table tb_name
drop table [if exists] tb_name;
drop table bbs; # 刪除bbs表
修改表:Alter table tb_name [ add|change|modify ]
alter table tb_name;
修改 modify 改屬性 改數據類型
改變 change 改值 改名稱
增加 add
刪除 drop
增加:add
語法格式: alter table students add 字段名varchar(100) # 添加字段名 指定數據類型varchar
實例: alter talbe students add telphone int(20); # 增加telphone列,
alter talbe students add telphone int(20) first ; # 在第1列增加telphone列,
alter talbe students add telphone int(20) after name ; # 在name列後增加telphone列,
修改值:change
例: alter table students change “原字段1“ ”現字段2“ varchar(100) after name;
修改”原字段1”的字段名和類型,添加到Nmae字符之後
要指定源字段,新字段,新類型
alter table user change age ages varchar(100);
修改屬性:modify
例: alter table users modify tel text(10);
修改tel字段的字段類型
刪除列: drop
例:alter table user drop id;
刪除user表中的id列
清空表:delete from tables | truncate table
delete 是邏輯刪除,一行一行刪
truncate 物理刪除,清空物理文件
清空表的內容
delect from jf_t1;
清空表的內容
truncate table user;
制一張表 create tables tb_name select from tb_name
複製一張表和數據:
create table new_table select from old_table;
複製一張表不復制數據
create table new_table select * from old_table where 0 ;
只複製表結構到新表
CREATE TABLE 新表 SELECT * FROM 舊錶 WHERE 1=2
或者
CREATE TABLE 新表 LIKE 舊錶
複製表結構及數據到新表
CREATE TABLE 新表 SELECT * FROM 舊錶
複製舊錶的數據到新表(假設兩個表結構一樣)
INSERT INTO 新表 SELECT * FROM 舊錶
複製舊錶的數據到新表(假設兩個表結構不一樣)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 舊錶
重命名錶 rename table
Rename TABLE tb_name TO new_tb_name
? alter table rename tb_name to new_table 重命名錶
表結構 desc table
mysql> desc mysql.user;
-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
3.3 Mysql 數據管理
插入數據:Insert into tb_name … values …
指定字段插入:
insert into tb_name (col1,col2,...)values ('string',num,...);
插入數據 (字段名) VALUES值 (‘字符串’, 數值1-9)
字符串要單引 數值不需要
單行插入
例: insert into tb_name (id,name)values (‘1’,’zhongliang’)
可同時插入多行數據
多行插入
例: insert into student (name,sex) value ('zhongliang'.‘man’)(‘xiaoliang’,'woman');
插入前先查詢表的結果DESC tb_name 看哪些是必須插入值的
# 未指定的字段代表是允許爲null的,可以不在字段位寫,按順序寫上不允許爲空的字段
不指定字段插入
不指定字段插入,代表全部都插入值
name age sex telnet
例:insert into students values ('zhongliang',20,'m',249765270);
語句插入1000條
create database hd;
create table techer (name char(20),tel char(20));
for i in `seq 10000`;do mysql -e "use hd;insert into techer (name,tel) values ('zhonglaing','123456789')";done
查詢內容:select * from table;
where條件:and or < >
order排序:
order by id asc # 按id正序排序
order by id desc # 按id倒序排序
顯示錶的所有字段
describe user;
select 字段 frome tb_name where 條件1 [and | or] 條件2
select count(*) from user; 統計多少行
select * from user limit 10; 看10行 # 在生產環境中不要查所有,應爲當上千條數據時會卡死
select * from user where 列名>30; # 查詢某列的值大於30的
select * from user where 列名 like ‘%abc%’; # 查詢某列的值包含匹配abc字符的所有內容
顯示user表的第一行內容
select * from user limit 1;
select * from user limit 1,3; # 查看第1行第3行內容
select * from user where name="" limit 10\G;
select name from user where nam="";
內容匹配查詢
select * from user name link "%zhong%";
select * from user name link "%zhong%" and name=xxx ;
排列顯示,
select * from user where User='root' \G;
多表查詢
select 表1.列1 , 表2.列2 , 表3.列3 from 表1,表2,表3 where 條件1 and 條件2
select user.id,student.name,address.tel from user,student,address where
修改數據:Update tb_name Set
update tb_name set 列名=“新值” where 列名=“value”; # id
例:update student set tel=249765270 where name=zhongliang;
# 修改zhongliang用戶的tel電話
update mysql.user set host='localhost' where host='127.0.0.1' and user='root'
刪除數據:Delete From tb_name where
delete from tb_name where id='value';
例:delete form student where tel=249765270
3.4Mysql 數據庫備份還原
Xtranbackup 開源物理備份工具
備份分爲邏輯備份和物理備份
邏輯備份:通過mysqldump備份過去
物理備份:通過將mysql目錄的數據庫文件拷貝過去
Mysqldump參數:
-A 備份所有庫
-B 備份多個庫 此參數使用後,自帶create database語句,在恢復時,可以事先不建數據庫就可憂復 如:mysqldump -uroot -p123456 </tmp/backup.sql
-x 鎖表
-l 只讀鎖表
-C 壓縮傳輸
--compact 去掉註釋輸出 用於調試
-d 備份表結構
-F 備份數據庫時,切割blog日誌,目的是防止備份數據與binlog重複,備份時記住binlog日誌文件序號
--master-data=1 自動查找binlog日誌位置節點 不需要手動入切割blog日誌 與-F二選一
=1 ; 在binlog中添加一條不帶註釋的change master的post節點和binlog文件名,用於在slave上導入時,能自動記錄post點和binlog文件位置,用於同步之後的binlog文件
=2: 在binlog中添加一條帶註釋的change master的post節點和binlog文件名
Mysql 全量備份與增量備份
全量備份:
全量部份就是將數據庫完整備份,mysql -uroot -p -A -B >/backup/mysql.sql
innodb 引擎備份:
mysqldump -uroot -p --default-character-set=gbk --single-transaction -F -B discuz | gzip >/databackup/mysql.sql.gz
innodb 引擎備份:
mysqldump -uroot -p --default-character-set=gbk --lock-all-tables -F -B discuz | gzip >/databackup/mysql.sql.gz
企業場景全量和增量的頻率是怎麼做的呢?
- 中小公司,全量一般是每天一次,業務流量低谷執行全備,備份時要鎖表
- 單臺數據庫,如何增量,用rsync(配合定時任務)把bin-log推送到遠端備份服務器上
例:rsync -avz mysql-bin* [email protected]::backup --password-file=/etc/rsync.passwd - 大公司周備,每週六00點一次全備,下週日-下週六00點前都是增量
-
一主多從,會有一個從庫做備份,延遲同步
mysql的備份什麼場景下使用?
- 遷移或升級數據庫的時候
- 添加從庫
- 主庫勿刪除時,需要備份還原
-
跨機房災備,需要備份
增量恢復全過程(針對前端可以暫停寫入)
- 先對數據庫進行鎖表,防止新數據寫入
- 找到全備和增備文件
grep -i "change" /backup/mysql.sql 找到全備最後的binlog的pos點位置,根據位置,找到增量的binlog日誌文件 - 如果前端不能鎖主庫,這時要馬上刷新binlog mysqladmin -uroot -p flush-logs 生成新的Binlog文件,這樣可以判
斷之後插入的數據會生成在新的binlog日誌文件中 - 將需要增量恢復的binlog日誌文件移動到新的目錄,以防二次損壞
- 執行mysqlbinlog mysql-bin.0000014 >/databackup/binlog14.sql 將binlog日誌生成sql語句
-
vi /databackup/binlog14.sql 將勿操作語句刪除,比如drop database之類的
增量恢復全過程(針對前端不可以暫停寫入) 不停庫不推薦
- 立即斷開從的sql_threed線程,防止從讀取relay-log日誌,
- 將主mysql的binlog進行分割 -F
- 將主mysql的最新全部和出故障前的binlog日誌進行恢復到從(前提要把日誌中出問題的語句先刪除)
- 然後將從提升爲主mysql
- 將原主mysql被切割的後面用戶寫入的新數據的binlog日誌恢復到現新的主mysql庫
-
缺點:可能導致後期寫入的數據不能插入,因爲在你恢復的時候,有人又寫入數據,導致主鍵衝突
最好的方案就是,在恢復最後寫入數據時,暫停最短時間導入新數據。
生產場景2:
爲了防止數據被勿刪除,有些公司針對主從同步設置了某一臺mysql從廷遲同步30-60分鐘,這樣做的目的是爲了防止主數據庫被執行勿刪除時,從能保證數據完整並通過把主binlog增量部份的日誌恢復到此從上,接替主的位置。
生產場影mysql數據恢復思路?
表重要的前題下:
- 停服務,掛維護頁面 防止前端寫入數據,保證數據一致性。
- 同時對故障的數據做一次備份,以防萬一
- 恢復內存全量備份 根據post點位置,將相應的binlog日誌恢復
-
啓動測試
Mysql備份數據庫
備份所有數據庫 mysqldump -uroot -p -B -A --events > all.sql # 備份服務器中所有的庫 備份mysql 使用root用戶,密碼123456 備份到/tmp/ mysqldump -uroot -p123456 -B mysql > /tmp/mysql2016.sql 數據庫壓縮備份 mysqldump -uroot -p123456 discuz | gzip > backupfile.sql.gz 解壓:gzip -d backupfile.sql.gz 同時備份多個MySQL數據庫 mysqldump -uroot -p123456 -B databasename1 databasename2 databasename3 > multibackupfile.sql 僅僅備份數據庫結構 mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql 跨主機備份 使用下面的命令可以將host1上的sourceDb複製到host2的targetDb,前提是host2主機上已經創建targetDb數據庫: mysqldump -uroot -p sourceDb | mysql –uroot –p --host=192.168.1.100 -C targetDb -C指示主機間的數據傳輸使用數據壓縮 目標主機必須gran授權允許源主機連接 mysqldump: Got error: 1016: Can't open file: './BBS/pre_home_feed.frm' (errno: 24) when using LOCK TABLES mysqldump -uroot -p123456 BBS --lock-tables=false > /data/bbs.sql mysqldump -uroot -p123456 -A -B --events --master-data=2 -x > /backup/all.mysql 企業常規備份 myisam mysqldump -uroot -p123456 -A -B --master-data=2 -x dicuz|gzip >/backup/all.sql.gz 企業常規備份 inodb mysqldump -uroot -p123456 -A -B --master-data=2 -x --single-transaction dicuz|gzip >/backup/all.sql.gz for myisam mysqldump --user=root --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triggers --routines --envents --hex-blob >/data/mysqlall.sql for innodb mysqldump --user=root --all-databases --flush-privileges --single-transaction --master-data=1 --flush-logs --triggers --routines --envents --hex-blob>/data/mysqlall.sql
Mysql基於slave備份數據
使用tar,copy,rsync來備份 在slave的my.cnf增加log-slave-updates配置,使slave也產生binlog日誌文件
Mysql恢復數據庫
注意: mysql在恢復數據庫的時候,最好像原數據庫清除重新初始化,並重新change master,記得要重啓數據庫同步纔會生效,恢復庫 mysql> mysql –uroot zhongliang < /tmp/zhongliang.sql; 恢復數據庫 先創建數據庫名,再恢復 還原壓縮的MySQL數據庫 gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
waiting to finalize termination
線程停止時發生的一個很簡單的狀態