mysql常用sql語句

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

企業場景全量和增量的頻率是怎麼做的呢?

  1. 中小公司,全量一般是每天一次,業務流量低谷執行全備,備份時要鎖表
  2. 單臺數據庫,如何增量,用rsync(配合定時任務)把bin-log推送到遠端備份服務器上
    例:rsync -avz mysql-bin* [email protected]::backup --password-file=/etc/rsync.passwd
  3. 大公司周備,每週六00點一次全備,下週日-下週六00點前都是增量
  4. 一主多從,會有一個從庫做備份,延遲同步

    mysql的備份什麼場景下使用?

  5. 遷移或升級數據庫的時候
  6. 添加從庫
  7. 主庫勿刪除時,需要備份還原
  8. 跨機房災備,需要備份

    增量恢復全過程(針對前端可以暫停寫入)

  9. 先對數據庫進行鎖表,防止新數據寫入
  10. 找到全備和增備文件
    grep -i "change" /backup/mysql.sql 找到全備最後的binlog的pos點位置,根據位置,找到增量的binlog日誌文件
  11. 如果前端不能鎖主庫,這時要馬上刷新binlog mysqladmin -uroot -p flush-logs 生成新的Binlog文件,這樣可以判
    斷之後插入的數據會生成在新的binlog日誌文件中
  12. 將需要增量恢復的binlog日誌文件移動到新的目錄,以防二次損壞
  13. 執行mysqlbinlog mysql-bin.0000014 >/databackup/binlog14.sql 將binlog日誌生成sql語句
  14. vi /databackup/binlog14.sql 將勿操作語句刪除,比如drop database之類的

    增量恢復全過程(針對前端不可以暫停寫入) 不停庫不推薦

    1. 立即斷開從的sql_threed線程,防止從讀取relay-log日誌,
    2. 將主mysql的binlog進行分割 -F
    3. 將主mysql的最新全部和出故障前的binlog日誌進行恢復到從(前提要把日誌中出問題的語句先刪除)
    4. 然後將從提升爲主mysql
    5. 將原主mysql被切割的後面用戶寫入的新數據的binlog日誌恢復到現新的主mysql庫
    6. 缺點:可能導致後期寫入的數據不能插入,因爲在你恢復的時候,有人又寫入數據,導致主鍵衝突
      最好的方案就是,在恢復最後寫入數據時,暫停最短時間導入新數據。

    生產場景2:

    爲了防止數據被勿刪除,有些公司針對主從同步設置了某一臺mysql從廷遲同步30-60分鐘,這樣做的目的是爲了防止主數據庫被執行勿刪除時,從能保證數據完整並通過把主binlog增量部份的日誌恢復到此從上,接替主的位置。

    生產場影mysql數據恢復思路?

    表重要的前題下:
  15. 停服務,掛維護頁面 防止前端寫入數據,保證數據一致性。
  16. 同時對故障的數據做一次備份,以防萬一
  17. 恢復內存全量備份 根據post點位置,將相應的binlog日誌恢復
  18. 啓動測試

    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
線程停止時發生的一個很簡單的狀態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章