mysql小记
?
另外應用的場合就是在服務器管理中,在不涉及數據庫服務器程序的父進程的停止運行,也可以用這些工具來終止。為什么數據庫服務器的父進程不能用這些工具殺死呢?原因很簡單,這些工具在強行終止數據庫服務器時,會讓數據庫產生更多的文件碎片,當碎片達到一定程度的時候,數據庫就有崩潰的危險。比如mysql服務器最好是按其正常的程序關閉,而不是用pkill?mysqld?或killall?mysqld?這樣危險的動作;當然對于占用資源過多的數據庫子進程,我們應該用kill?來殺掉。
?
更改mysql命令提示符,為了防止誤操作
1、臨時修改 mysql> prompt \u@weiwei \r:\m:\s-> , PROMPT set to '\u@weiwei \r:\m:\s->' root@weiwei 01:11:11-> 2、永久修改到配置文件里面 [mysql] prompt=\\u@weiwei \\r:\\m:\\s->?
查看用戶的權限
select user,host from mysql.user; +------+-----------------------+ | user | host | +------+-----------------------+ | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | localhost.localdomain | | root | localhost.localdomain | +------+-----------------------+ 6 rows in set (0.00 sec)SHOW GRANTS FOR 'root'@'localhost'; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 2 rows in set (0.00 sec)?
密碼修改
為管理員root用戶設置密碼,在linux命令行 mysqladmin -u root password'****' mysqladmin -uroot password oldboy123 -S /data/3306/mysql.sock有密碼后修改密碼 命令行修改密碼 mysqladmin -u root -p oldpassword password'****' #mysqladmin -u root -p password password'*****' -S /data/3306/mysql.sock通過sql語句修改密碼,這種方法適合root密碼忘記了的情況來修改密碼,這個有風險,條件必須指定正確,必須使用password()函數來加密,有時候單引號可能有問題 update mysql.user set password=password("456") where user='root' and host='localhost' flush privileges;通過set password=password('***')單實例 修改完密碼后,如果此時提示關于pid的問題就用以下的方法,則需要mysqladmin -u root -pnewpassword shutdown,然后再開啟多實例的方式
mysql_safe --defaults-file=/data/3306/my.cnf --skip-grant-table & mysql -u root -p -S /data/3306/mysql.sock 登錄
sql分類:
1、數據查詢語言(DQL) select 2、數據操作語言(DML) insert update delete 3、事務處理語言(TPL) begin transaction commit rollback 4、數據控制語言(dcl) grant revoke 5、數據定義語言(ddl) create drop 6、指正控制語言(ccl) declare cursor fetch into常用的就3類 DDL-數據定義語言 create alter drop =======運維用的多 DML-數據操作語言 select insert delete update=======開發用的多 DCL-數據控制語言 grant revoke commit rollback===========運維用的多查看建庫語句
show create database oldboy\G *************************** 1. row ***************************Database: oldboy Create Database: CREATE DATABASE `oldboy` /*!40100 DEFAULT CHARACTER SET utf8 */ 1 row in set (0.00 sec)創建一個GBK的數據庫
create database oldboy_gbk default character set gbk collate gbk_chinese_ci; mysql> show create database oldboy_gbk; +------------+--------------------------------------------------------------------+ | Database | Create Database | +------------+--------------------------------------------------------------------+ | oldboy_gbk | CREATE DATABASE `oldboy_gbk` /*!40100 DEFAULT CHARACTER SET gbk */ | +------------+--------------------------------------------------------------------+ 1 row in set (0.00 sec?
創建一個utf8的數據庫
create database oldboy_utf8 character set utf8 collate utf8_general_ci;?
像這些字符集的問題可以在編譯的時候定義進去,指定之后就不用在設置,使用默認值
企業里要根據開發的程序確定字符集(建議utf8),編譯的時候指定字符集
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
?
刪除系統多余賬號
drop user "user"@"主機" 如果drop刪除不了,可以用下面的方式刪除 delete from mysql.user where user='root' and host ='oldboy'; flush privileges;?
通過grant命令創建用戶并授權:
例子: CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost'; GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90; grant all privileges on dbname.* to username@localhost indentified by 'passwd' 授權命令 對應權限 目標:庫和表 用戶名和客戶端主機 用戶密碼一步到位的方法 grant all privileges on test.* to oldboy@'localhost' identified by '123'; show grants for oldboy@localhost;先創建用戶再授權 create user oldgirl@localhost identified by '123'; grant all on dbname.* to username@localhost;?
授權局域網內主機遠程連接數據庫:
根據grant命令,我們知道test@localhost位置為授權訪問數據庫的主機,localhost可以用域名,ip地址或ip段來代替,因此,要授權局域網內主機可以通過如下方法實現: 1、百分號匹配 grant all on *.* to test@'10.0.0.%' identified by '****' 2、子網掩碼匹配 grant all on *.* to test@'10.0.0.0/255.255.255.0' identified by '****'flush privileges; mysql用戶可以授權的權限,授權的時候最好不要給所有的權限 收回insert權限 revoke insert on test.* from oldboy@localhost;所以企業中一般都給select ,insert update delete4個權建表 create table 表名( <字段名1><類型1>, …… <字段名n><類型n>);查看建表語句 show create table ****;查看建表的描述 desc *****
?
為表的字段創建索引
創建主鍵索引,查詢數據庫,按主鍵查詢是最快的,每個表只能有一個主鍵列,但是可以有多個普通索引列。主鍵列要求列的所有內容必須唯一,而普通索引列不要求內容必須唯一。1、可以在建表的時候就創建索引 create table student( id int(4) 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) 普通索引 );2、建表后通過alter命令增加主鍵索引(不建議這么搞) alter table student drop primary key;alter table student change id id int primary key auto_increment
3、唯一索引,在有主鍵的情況下,還想讓某列唯一,就要創建唯一索引普通索引 alter table student drop index index_namealter table student add index index_name(name);索引名字唯一索引,通常是用來約束表的內容(非主鍵) create unique index index_name on student(name);
?
4、對字段的前n個字符創建普通索引 create index index_name on table(name(8));索引名字 表 列show index from table\G5、為表的多個字段創建聯合索引 如果查詢的數據條件是多列時,我們可以為多個查詢的列創建聯合索引,甚至可以為多列的前n個字符列創建聯合索引 create index ind_name_dept on student(name,dept)drop index ind_name_dept on student;name列的前8個字符,dept列的前10個字符 create index ind_name_dept on student(name(8),dept(10))注意:按條件列查詢數據時,聯合索引是有前綴生效特性的 index(a,b,c)僅a,ab,abc三個查詢條件列可以走索引,別的都不可以,b,bc,ac,c等無法使用索引
索引列的創建及生效條件
1、既然索引可以加快查詢速度,那么就給所有的列建索引把?
因為索引不但占用系統空間,更新數據庫時還需要維護索引數據的,因此,索引是一把雙刃劍,并不是越多越好,數十到幾百行的小表上無需建立索引,更新頻繁,讀取比較少的表要少建立索引
2、需要在哪些列上創建索引
select user,host from mysql.user where host=……,索引一定要創建在where后的條件列上,而不是select后的選擇數據的列,另外,我們要盡量選擇在唯一值多的大表上建立索引。
對表的操作
插入,最好是批量插入不要一個個插入 1、按規矩指定所有列名,并且每列都插入值 insert into test(id ,name) values(1,'oldboy'); 2、由于id列為自增的,所以,可以只在name列插入值 insert into test(name) values('oldgirl');3、如果不指定列,就要根據表結構 insert into test values(3,'adfasdf'); 也可以一次插多個insert into test values(3,'adfasdf'),(4,'3242342d');
數據庫的備份:
mysqldump -uroot -ppass -B database >/opt/oldboy_bak.sql數據庫 清空一個文件 >******恢復 mysql -uroot -ppass oldboy </opt/oldboy_bak.sqlselect,不要用*,用具體的列會好select id,name from test limit 2; select id,name from test where id=1; select id,name from test where name='adsfadsf';字符串要加引號select id,name from test order by id desc;倒敘,默認升序 select id,name from test order by id aesc;升序
多表查詢,例子
select student.no,student.name,sc.grade,cource.name from student,sc,cource where student.sno=sc.no and cource.jjj使用ecplain查詢select語句的執行計劃 如果發現此條sql語句沒有走索引可能就會出現問題 explain select * from test where name='dfafds'\G
修改表中的數據
update test set name='gongli' where id=3,如果不加條件會將整個表都給改了
防止mysql數據誤操作
在登錄的時候加上-U參數 mysql -uroot -ppass oldboy -U 這樣就無法對數據寫
刪除數據
delete from test where id=1 不加條件會全部刪除
清空表
truncate table test;
添加字段
alter table test add sex char(4);alter table test add age(4) after name;help alter table
更改表名
rename table test to test1alter table test1 rename to test
刪除表
drop table test;
mysql插入中文不亂碼5種方法:
1、登錄mysql,先做”set names latin1;“,然后在執行更新語句或執行語句文件 set names latin1; source test.sql 2、在sql文件中指定set names latin1;然后登錄mysql,通過如下命令執行。 source test.sql 3、在sql文件中指定set names latin1;然后通過mysql命令導入數據 mysql -uroot -ppass oldboy<test.sql mysql -uroot -ppass oldboy -e "set names latin1;select * from oldboy.test;" 4、通過指定mysql命令的字符集參數實現--default-character-set=latin1 cat test.sql mysql -uroot -ppass --default-character-set=latin1 oldboy <test.sql 5、在配置文件中改。不亂碼的思想就是客戶端與服務端的字符集同意,庫表,程序都統一 客戶端 臨時更改: set names latin1 永久: 更改my.cnf 客戶端模塊的參數,可以實現set names latin1 的效果,并且永久生效服務端 更改配置文件 [mysqld] default-character-set=utf8 適合5.1及以前的版本 character-set-server=latin1 適合5.5庫表,程序create database oldboy default character set utf8 collate utf8_general_ci;?
show variables;
show status;
show global status;
key_buffer /etc/my.cnf myisam引擎的緩沖
mysql -e
?
GBK 長度2 不是國際標準UTF-8 3 中英文混合的環境,建議使用此字符集,用的比較多latin1 1 mysql的默認字符集utf8mb4 4 utf-8 unicode ,這個好像用于ios開發方面mysql如何選擇合適的字符集
字符集的選擇:1、如果處理各種各樣的文字,發布到不同的語言國家地區,應選unicode字符集,對mysql來說就是utf-8(每個漢字三個字節),如果應用需處理英文,僅有少量漢字utf-8更好2、如只需支持中文,并且數據量很大,性能要求也很高,可選GBK(定長,每個漢字占雙字節,英文也占雙字節),如果需要大量運算,比較排序等,定長字符集,更快,性能高3、處理移動互聯網業務,可能需要使用utf8mb4字符集show variables like 'character_set%';character_set_client 客戶端字符集 客戶端[client]character_set_connection 連接字符集 客戶端[client]character_set_database 數據庫字符集,配置文件指定或建庫建表指定 可以在配置文件中的服務端也就是[mysqld]中修改character_set_results 返回結果字符集 客戶端[client]character_set_server 服務器字符集,配置文件指定或建庫建表指定 可以在配置文件中的服務端也就是[mysqld]中修改
系統上更改/etc/sysconfig/i18n上修改字符集后需要 . /etc/sysconfig/i18n生效 相當于source /etc/sysconfig/i18n
LANG='zh_CN.utf8'
?
當字符集不對時,插入的值也是不對的。就算插入之后改成正確的字符集,還是會顯示亂碼
當字符集不對時,需要根據庫和表的字符集進行改
?
所以要環境不出問題,全都搞utf8
?
當mysql字符集出現問題即數據出現亂碼時,先查看系統,服務端,客戶端,庫,表等的字符集,默認情況下,建庫的時候的默認字符集是跟隨系統的,如果創建數據庫或者表時改了字符集就要用show create database/table ***\G,查看字符集,然后修改字符集為該庫/表的字符集set names ***。
?
對于已有的數據庫想修改字符集不能直接通過"alter database character set ****"或"alter table tablename character set ***",這兩個命令都沒有更新已有記錄的字符集,而只是對新創建的表或者記錄生效。
已經有記錄的字符集的調整,必須先將數據導出,經過修改字符集后重新導入后才可完成。
下面模擬將latin1字符集的數據庫修改成GBK字符集的實際過程。
?
轉載于:https://www.cnblogs.com/bill2014/p/7217487.html
總結
- 上一篇: css border 制作三角形
- 下一篇: sitcbatangas中文船名