注意 : 在进行 MySQL 的优化以前必需要了解的就是 MySQL 的查询过程;html
MySQL数据库放在WEB网站后端数据存储,数据库通常用于持久化数据,存储内存或者硬盘上,主要存储在硬盘中。前端
MySQL主从复制构架根本目标保证网站高可用,当master宕机,可以快速切换到slave库;java
MySQL主从复制最大用途为了保证主库和从库数据的完整性,保证数据同步。node
MySQL主从同步是异步复制过程,中间同步数据会有延迟,整个过程开启三个线程,分别是master开启IO线程 ,Slave开启IO 和 SQL线程。mysql
还须要在Master上开启bin-log功能,是主从复制最核心组件,二进制日志文件,文件会记录数据库中增、删、改、插入的SQL语句。ios
从库就能够基于master端bin-log日志来同步数据,读取bing-log日志来同步数据,读取bin-log日志文件中SQL语句,而且把SQL语句放在本地去执行。web
Slave库经过I/O线程链接Master,发起数据请求,请求从指定bin-log文件、位置点以后的SQL语句。面试
Master数据库收到Slave的请求(指定bin-log文件名、position点以后的内容),以IO线程响应,命令行show processlist查看 , 在master端看到的bin-log dump 线程,将bin-log日志指定位置点的SQL内容dump出来,发送给Slave数据库服务器;sql
当Slave库收到bin-log日志内容以后,将信息追加存储到Relay-log中继日志,同时会生成master.info文件(记录master端IP、用户名、密码、bin-log文件名、Position点);mongodb
Slave数据库服务器实时启动SQL线程,SQL线程检测relay-log日志中是否有更新,内容有更新的话,解析日志中SQL语句,而且在本地数据库中执行;
SQL线程执行玩SQL语句,那就保证了Slave库和Master数据一致,从而实现主从数据同步 ,执行完的效果,Slave库Master数据保存一致;
Mariadb Bin-log功能
1)Bin-log文件是一个二进制文件,二进制文件,不能直接打开;
2)主要用于存储数据库事务操做的,存储在数据库中各个操做 (增、删、改、插入);
3)若是开启bin-log日志功能以后,bin-log文件记录在数据库中各类修改操做的SQL语句。
4)基于bin-log文件,实现数据库数据增量备份、完整备份,军科院从而基于该备份实现数据还原;
5)Bin-log日志实现MYSQL主从复制,主从复制,Slave端来获取数据,实际上是获取bin-log日志中的数据;
MySQL默认配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log//var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid
MySQL主从同步、半同步、主主同步、全同步
1)MySQL主从同步是5.5以前的版本默认数据同步方式;
2)从MySQL5.5以后,MySQL数据同步开始引入半同步;
3)MySQL5.7.4之后,对MySQL半同步进一步优化,引入多线程实现数据更高效的传输;
4)MySQL心版本支持全同步,Group同步,普及难度高;
经常使用的关系型数据库软件 :MySQL、mariadb、Oracle、SQL Server、PostgreSQL、DB2等;
注意 :Myisam:MYSQL5.5以前默认引擎,不支持事务、不支持外部键、表锁、应用于大量的select,查询比较多。 MySQL5.5之后不支持./configure编译,使用cmake编译。
MySQL引擎 : MyISAM、InnoDB、memory、CSV。
MyISAM类型的数据库表强调的是性能,其执行速度比InnoDB类型更快,但不提供事务支持,不支持外键,若是执行大量的SELECT(查询)操做 , MyISAM是更好的选择,支持表锁;
InnoDB提供事务支持事务、外部键、行级锁等高级数据库功能,执行大量的INSERT或UPDATE,处于性能方面的考虑,能够考虑使用InnoDB引擎;
RDBMS(关系数据库管理系统)数据库的特色以下 :
一、数据以表格的形式出现;
二、每行记录数据的真实内容;
三、每列记录数据真实内容的数据域;
四、无数的行和列组成一张表;
五、若干的表组成一个数据库;
MySQL主从原理解析 :
1)MySQL主从是异步复制过程,整个过程选哟开启三个线程,分别是Master开启I/O线程 ,Slave开启I/O和SQL线程,同时master必须开启bin-log日志功能。
2)第一次salve start : 以IO线程经过受权用户名和密码链接Master,说请求某个bin-log某个position点以后的内容,master收到请求以后;
3)Master会经过I/O线程bin-log内容返给slave IO线程,Slave服务器收到bin-log文件中的内容以后,存放在本地的relay-log日志中,同行会产生一个master.info文件(存放bin-log文件名称、用户名、密码明文、最后position点)方便下次同步读取配置信息;
4)Slave端有一个SQL线程,SQL线程实时运行,监测relay-log日志文件是否更新,若是有更新的话,就把内容解析成SQL语句。
5)解析成SQL语句,会在本地去执行,执行完的效果保持数据同步。
MySQL数据库常见索引类型 :普通索引(normal)、惟一索引(unique)、全文索引(full text)、主键索引(primary key)、组合索引等,以下为每一个索引的应用场景及区别:
普通索引:normal,使用最普遍;
惟一索引:unique,不容许重复的索引,容许有空值;
全文索引:ful text ,只能用于MyISAM表,FULLTEXT主要用于大量的内容检索;
主键索引: primary key 又称为特殊的惟一索引,不容许有空值;
组合索引:为提升mysql效率可创建组合索引;
MySQL数据库在存储数据时,默认编码latin1,存储中文字符时,在显示或者WEB调用时会显示乱码,为解决该乱码问题,在相应段中加入相应的参数 :
一、编译vim /etc/my.cnf配置文件,在相应段中加入相应的参数:
[client]字段里加入 : default-character-set=utf8
[mysqld]字段里加入 : character-set-server=utf8
[mysql]字段里加入 :default-character-set=utf8
字符集修改完毕,重启MySQL服务,便可;
二、MySQL命令行中运行以下指令,
show variables like '%char%';
SET charracter_set_client = utf8;
SET charracter_set_results = utf8;
MySQL数据库表建立各个索引命令,以t1为案例。
主键索引 :ALTER TABLE t1 ADD PRIMARY KEY ('column');
惟一索引 :ALTER TABLE t1 ADD UNIQUE ('column');
普通索引 :ALTER TABLE t1 ADD INDEX index_name ('column');
全文索引 : ALTER TABLE t1 ADD FULLTEXT ('column');
组合索引 : ALTER TABLE t1 ADD INDEX index_name ('column1','column2','column3',);
MySQL建立用户及受权
grant all on jfedu.* to test@localhost identified by 'pass'; #受权localhost主机经过test用户和pas密码访问本地的jfedu库的全部权限;
grantselect,insert,update,delete on *.* to test@"%" identified by 'pass'; #受权全部主机经过test用户和pass密码访问本地的jfedu库查询、插入、更新、删除权限;
grant all on jfedu.* to test@'192.168.111.118' identified by 'pass'; #受权192.168.111.118主机经过test用户和pass密码访问本地jfedu库的全部权限;
MySQL数据库表删除各个索引命令,以t1表为案例
DROP INDEX index_name ON t1;
ALTER TABLE t1 DROP INDEX index_name;
ALTER TABLE t1 DROP PRIMARY KEY;
MySQL数据库查看表索引:
show index from t1;
show keys from t1;
MySQL数据库索引的缺点 :
一、MySQL数据库索引虽然可以提升数据库查询速度,但同时会下降更新、删除、插入表的速度,例如如对表进行INSERT、UPDATE、DELETE时,update表MySQL不只要保存数据,还须要保存更新索引;
二、创建索引会占用磁盘空间,大表上创建了多种组合索引,索引文件的会占用大量的空间。
MySQL数据库慢查询
MySQL数据库慢查询主要用于追踪异常的SQL语句,能够分析出当前程序里那些SQL语句比较耗费资源,慢查询日志则用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL语句,会被记录到慢查询日志中。
MySQL数据库默认没有开启慢查询日志功能,需手动在配置文件或者MySQL命令行中开启,慢查询日志默认写入磁盘中的文件,也能够将慢查询日志写入到数据库表:
查看数据库是否开启查询
show variables like '%slow%';
show variables like '%long_query%';
MySQL慢查询参数详解以下 :
log_slow_queries 关闭慢查询日志功能
log_query_time #慢查询超时间,默认为10s;MySQL5.5以上能够设置微秒;
slow_query_log_file # 关闭慢查询日志;
slow_launch_time #Thread create时间,单位秒,若是thread crete 的时间超过了这个值,该变量slow_launch_time的值会加1;
log-queries-using-indexes 记录来添加索引的SQL语句
开启MySQL慢查询日志方法有两种 :
(1)、mysql数据库命令执行命令:
set global slow_query_logon;
show variables liek '%slow%';
(2)、编辑my.cnf配置文件中添加瑞小安代码:
log-slow-queries = /data/mysql/localhos.log;
long_query_time = 0.01
log-queries-not-using-indexes
慢查询功能开启以后,数据库会自动将执行时间超过设定时间的SQL语句添加至慢查询日志文件中,能够提供慢查询日志文件定位执行慢的SQL,从而对其优化,能够经过msyqldumpslow命令行工具分析日志,相关参数以下:
执行命令mysqldumpslow -h 能够查看命令帮助信息:
MySQL数据库优化
MySQL数据库优化是一项很是重要的工做,并且是一项长期的工做,MySQL优化三分靠配置文件及硬件资源的优化,七分靠SQL语句的优化。
MySQL数据库集体优化包括 : 配置文件的优化、sql语句的优化、表结构的优化、索引的优化, 而配置的优化包括 :系统内核优化、硬件资源、内存、CPU、mysql自己配置文件的优化、
硬件上的优化 :增长内存和提升磁盘读写速度,均可以提升mysql数据库的查询,更新的速度,另外一种提升MySQL性能的方式是使用多块磁盘类存储数据,由于能够从多看磁盘上并行读取数据,这样能够提升数据的速度。
MySQL参数的优化 : 内存中会为mysql保留部分的缓冲区,这些缓冲区能够提升MySQL的速度,缓冲区的大小能够在MySQL的配置文件中进行设置。
附企业级MySQL百万量真实环境配置my.cnf内容,能够根据实际清空修改 :
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user =mysql
server_id = 10
port = 3306
socket = /tmp/mysql.sock
datadir = /data/mysql
old_passwords = 1
lower_case_table_names =1
character-set-server = utf8
default-storage-engine = MYISAM
log-bin = bin.log
log-error = error.log
slow_query_log_file = slow.log
binlog_cache_size = 4M
binglog_format = mixed
max_lbinlog_cache_size = 16M
max_binlog_size = 1G
expire_logs_days = 30
ft_min_word_len = 4
back_log = 512
max_allowed_packet = 64M
max_connections = 4096
max_connect_errors = 100
join_buffer_size = 2M
read_buffer_size = 2M
sort_buffer_size =2M
query_cache_size = 64M
table_open_cache = 10000
thread_cache_size = 256
max_heap_table_size = 64M
tmp_table_size = 64M
thread_stack =192K
thread_concurrency = 24
local-infile =0
skip-show-database
skip-name-resolve
skip-external-locking
MySQL日志文件系统的组成 :
a、错误日志:记录启动、运行或中止mysqld时出现的问题。
b、通用日志:记录创建的客户端链接和执行的语句。
c、更新日志:记录更改数据的语句。该日志在MySQL 5.1中已再也不使用。
d、二进制日志:记录全部更改数据的语句。还用于复制。
e、慢查询日志:记录全部执行时间超过long_query_time秒的全部查询或不使用索引的查询。
f、Innodb日志:innodb redo log。
Innodb 四大 IO 线程:write thread,read thread,insert buffer thread,redo log thread
master thread 是数据库的主线程,优先级别最高,里面包含 1s 和 10s 对数据库的操做。
page cleaner thread:帮助刷新脏页的线程,5.7 版本能够增长多个。
purge thread :删除无用 undo 页。默认1个,最大能够调整到 32。
针对 Innodb 存储引擎的三大特性有:两次写,自适应哈希索引,插入缓冲;
MySQL中有六种日志文件,分别是:重作日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、通常查询日志(general log),中继日志(relay log)。
重作日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重作日志写入innodb_log_buffer中。使用show variables like 'innodb_log_buffer_size';命令;
经过一条 sql 语句进入数据库的过程:
注意 :在 MySQL 8.0 中, 默认的密码加密方式是 SHA2
。
经过如下三种方式将innodb日志缓冲区的日志刷新到磁盘
1,Master Thread 每秒一次执行刷新Innodb_log_buffer到重作日志文件。
2,每一个事务提交时会将重作日志刷新到重作日志文件。
3,当重作日志缓存可用空间 少于一半时,重作日志缓存被刷新到重作日志文件
由此能够看出,重作日志经过不止一种方式写入到磁盘,尤为是对于第一种方式,Innodb_log_buffer到重作日志文件是Master Thread线程的定时任务。
缺省状况下,全部日志建立于mysqld数据目录中。
能够经过刷新日志,来强制mysqld来关闭和从新打开日志文件(或者在某些状况下切换到一个新的日志)。
当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,则日志被老化。
对于存在MySQL复制的情形下,从复制服务器将维护更多日志文件,被称为接替日志。
数据库优化维度有四个:硬件、系统配置、数据库表结构、SQL及索引
优化选择
优化成本:硬件>系统配置>数据库表结构>SQL及索引
优化效果:硬件<系统配置<数据库表结构<SQL及索引
优化工具
数据库层面
检查问题经常使用工具
mysqlmsyqladmin mysql客户端,可进行管理操做mysqlshow 功能强大的查看shell命令show [SESSION | GLOBAL] variables 查看数据库参数信息SHOW [SESSION | GLOBAL] STATUS 查看数据库的状态信息information_schema 获取元数据的方法SHOW ENGINE INNODB STATUS Innodb引擎的全部状态SHOW PROCESSLIST 查看当前全部链接session状态explain 获取查询语句的执行计划show index 查看表的索引信息
show index from t; #查看t表的索引slow-log 记录慢查询语句mysqldumpslow 分析slowlog文件的
不经常使用但好用的工具
zabbix 监控主机、系统、数据库(部署zabbix监控平台)pt-query-digest 分析慢日志mysqlslap 分析慢日志sysbench 压力测试工具mysql profiling 统计数据库总体状态工具Performance Schema mysql性能状态统计的数据workbench 管理、备份、监控、分析、优化工具(比较费资源)
一、远程 mysql -u 用户名 -p密码 等其余参数
退出 :quit; 、 exit ;
二、基础操做 建立数据库 : create database 数据库库名;
显示全部的数据库 : show databases;
删除 : drop databases 数据库名;
建立数据表 : 指定数据库 :use 数据库名;
建立新表 :create table 表名(域名 数据类型 列选项[]);
指定字符集 : 支持中文在建立新表命令后添加语句:charset=utf8;
三、数据插入及显示 插入 : insert into 表名(列名1,列明2,……) values(数据1 数据2);
显示 : select 列名1,列名2,……from表名
四、显示表信息 显示全部表
显示表结构 :desc/describe 表名;
删除表 : drop table 表名;
五、数据插入及显示 插入 : insert into 表名(列名1,列名2……) values (数据1,数据2……)
六、自增序列的设置 :数据类型必须为int,列的定义后附加关键字 auto_incre,ment使用primary key设置其惟一性:alter table 表名 auto_increment =0
七、更新 update 表名 set 列名1=值1,列名2=值2,……where条件表达式;
八、删除 delete from 表名 where 条件表达式;
truncate table 表名; #删除全部的数据
九、查询 select列表1,列名2,…… from 表名[条件表达式]; 条件检索 : where birth>='1980-10-10';
模糊检索:where nam like '李%'
NULL条件 :where birth is NULL;
多条件结合:where sex='1' and birth is not NULL;
结果排序:order by sex asc(升),birth desc(降);
指定区间 :order by birth desc limit 2;排序后取前几 top 2 排名靠前两位的
案例:
把姓名为“张三”,改为“李四”(误更改数据):
mysql > update t1 set name='李四' where id = 1;
查询一小时内的历史数据。
SELECT * FROM t FOR SYSTEM_TIME BETWEEN (NOW() - INTERVAL 1 HOUR) AND NOW();
查询一段时间内的历史数据。
SELECT * FROM t1 FOR SYSTEM_TIME FROM '2018-05-15 00:00:00' TO '2018-05-15 14:00:00';
查询全部历史数据。
SELECT * FROM t1 FOR SYSTEM_TIME ALL;
恢复历史数据
找到了历史数据“张三”,只需把它导出来作恢复便可。
SELECT id,name FROM t1 FOR SYSTEM_TIME ALL where id = 1 AND name =
'张三' into outfile '/tmp/t1.sql' \
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
FIELDS TERMINATED BY ',' —— 字段的分隔符
OPTIONALLY ENCLOSED BY '"' —— 字符串带双引号
导入恢复。
load data infile '/tmp/t1.sql' replace into table t1 \
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' \
(id,name);
十、修改表的列结构 改变列的数据类型 :alter talble 表名 modify 列名 数据类型;
追加新列:alter table 表名 add 列名 数据类型;
改变列的位置:alter table 表名 modify 列名1 数据类型after 列名2;
改变列名与类型: alter table 表名 change 列名——改前 to 列名_改后;
删除列:alter table 表名 drop lie名;
十一、复制表和修改表 表的列构造+数据复制 : create table 新表名 select * from 旧表名;
列构造 : create table 新表名 like 旧表名;
数据复制 :insert into 表名 select * from 含数据的表;
十二、显示/查看数据库具体信息
用来显示受权用户的安全权限:SHOW GRANTS;
用来显示数据库服务器或警告信息:SHOW ERRORS 或者SHOW WARNINGS;
用于显示建立数据库时的建立语句:SHOW CREATE DATABASE customers;
获取当前所选的数据库中全部可用的表:SHOW TABLES;
获取表中全部列的信息:SHOW COLUMNS FROM tableName;同时DESCRIBE语句有相同的效果:DESCRIBE tableName;
命令 | 描述 |
---|---|
SELECT VERSION( ) | 服务器版本信息 |
SELECT DATABASE( ) | 当前数据库名 (或者返回空) |
SELECT USER( ) | 当前用户名 |
SHOW STATUS | 服务器状态 |
SHOW VARIABLES | 服务器配置变量 |
MySQL 的数字列类型
类型名 涵义
TINYINT 一个很小的整数
SMALLINT 一个小整数
MEDIUMINT 一个中等大小整数
INT、INTEGER 一个正常大小整数
BIGINT 一个大整数
FLOAT 一个小(单精密)浮点数字
DOUBLE 一个正常大小(双精密)浮点数字
DOUBLE PRECISION
REAL
DECIMAL 一个未压缩(unpack)的浮点数字, “未
NUMERIC 压缩”意味着数字做为一个字符串被存储
CHAR 一个定长字符串
VARCHAR 一个变长字符串
TINYBLOB 最大长度为 255(2^8-1)个字符的
TINYTEXT BLOB 或TEXT 列
BLOB 最大长度为 65535(2^16-1)个字符的
TEXT BLOB 或TEXT 列
MEDIUMBLOB 最大长度为16777215(2^24-1)个字符
MEDIUMTEXT 的 BLOB 或TEXT 列;
LONGBLOB 最大长度为4294967295(2^32-1)个字
LONGTEXT 符的 BLOB 或TEXT 列;
ENUM('value1','value2',... 枚举:列只能赋值为某个枚举成员或
NULL
)
SET('value1','value2',...) 集合:列能够赋值为多个集合成员或
NULL
MySQL的数字列类型有两种:
MySQL提供的字符串类型包括 CHAR、VARCHAR、BLOB、TEXT、ENUM和 SET
mysql数据库使用总结
本文主要记录一些mysql平常使用的命令,供之后查询。
1.更改root密码
mysqladmin -uroot password 'yourpassword'
修改密码:mysqladmin -u USER -p password PASSWORD(修改密码会提示输入原密码)
刷新:flush privileges
1,给用户配置初始密码123456:
mysqladmin -u root -password 123456
2,修改root用户密码为 abc123
mysqladmin -u root -p123456 password abc123
3,若是想去掉密码:
mysqladmin -u root -pabc123 password
4,root链接数据库有密码和无密码:
mysql -u root(-uroot) -p
mysql
5.root查看用户密码及权限
select user,host,password from mysql.user;
select * from mysql.db;
mysql帐号权限添加:
mysql -uroot -p
mysql>insert into mysql.user(Host,User,Password) values('%', 'userrw', password('userrw'));
mysql>flush privileges; #刷新权限
建立一个能够从任何地方链接到服务器的一个超管帐户,必须分配一个密码
mysql>grant all on *.* to 'user_name'@'%' identified by 'password'; #赋予所有权限
格式:grant select on 数据库.* to 用户名@登陆主机 identified by “密码”
建立主从帐号:
grant replication slave on *.* to 'repl'@'192.168.56.%' identified by 'repl';
flush privileges;
删除受权:
mysql> revoke all privileges on *.* from root@”%”;
mysql> delete from user where user=”root” and host=”%”;
mysql> flush privileges;
重命名表:
mysql > alter table t1 rename t2;
备份:
mysqldump -hhostname -uusername -ppassword databasename > backup.sql;
恢复:
mysql -hhostname -uusername -ppassword databasename< backup.sql;
mysql>grant select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file on *.* to 'userrw'@'%' identified by 'userrw';
mysql>flush privileges;
#mysql 5.7以上版本添加mysql.user帐号方法(password字段改成了authentication_string):
CREATE USER 'user'@'localhost' IDENTIFIED BY 'userrw';
CREATE USER 'userro'@'localhost' IDENTIFIED BY 'userro';
grant all privileges on db.* to 'userrw'@'localhost';
grant all privileges on db.* to 'userro'@'localhost';
更改数据库、表和列的字符集和排序规则属性以使用utf8mb4
而不是utf8
.
# For each database: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # For each table: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # For each column: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
在MySQL配置文件(/etc/my.cnf
)修改字符集为utf8mb4:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
mysql>SET NAMES utf8mb4; # just to emphasize that the connection charset is set to `utf8mb4`
查看设置的字符集是否成功。
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+
对要修复和优化的每一个表运行如下MySQL查询:
# For each table REPAIR TABLE table_name; OPTIMIZE TABLE table_name;
幸运的是,这能够很容易地使用命令行一次完成。mysqlcheck
效用:
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
这将提示根用户的密码,在此以后,全部数据库中的全部表都将被修复和优化。
修改方式有两种
1.命令行修改
进入mysql后,set GLOBAL max_connections=1024; 便可当即生效,可是博主没有使用这种方式,由于这种方法治标不治本,一点重启mysql,最大链接数又会变回151
2.修改配置,而后重启
vi /etc/m.cnf加入max_connections=1024,而后重启mysql便可。
重启后,很遗憾,max_connections变成了214,这就很诡异了。我把max_connections又分别设置成500和213,实际的max_connections分别是214和213。也就是说,在这台服务器上,max_connections最大只能是234,猜想是由于操做系统的限制致使max_connections最大只能为213。max_connections依托于操做系统,Linux系统必要时须要增长open-files-limit。修改max_connections居然要修改操做系统最大文件描述符。
vi /usr/lib/systemd/system/mysqld.service加入
LimitNOFILE=50000
重启MySQL
=
将 MySQL 8.0 中已有的 SHA2
密码修改成 SHA1
的模式。
# 更新用户的密码加密方式为以前版本的方式 mysql> ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password'; # 刷新权限 mysql> FLUSH PRIVILEGES;
注:若是没有特殊的缘由,建议使用更安全的新加密方式。
在 MySQL 8.0 用以前版本受权语句建立用户。
mysql> GRANT ALL PRIVILEGES ON *.* TO `mike`@`%` IDENTIFIED BY '000000' WITH GRANT OPTION; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '000000' WITH GRANT OPTION' at line 1
在 MySQL 8.0 版本中正确受权语句。
mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000'; mysql> GRANT ALL ON *.* TO 'mike'@'%' WITH GRANT OPTION;
密码过时时间管理
并在 MySQL 5.7.4 版本中改进了用户密码过时时间这个特性。如今能够经过一个全局变量 default_password_lifetime
来设置一个全局的自动密码过时策略。
default_password_lifetime
其默认值为 0,表示禁用自动密码过时。default_password_lifetime
的值如是是正整数 N ,则表示容许的设置密码生存周期 为 N,单位为天 。
default_password_lifetime
全局密码到期策略默认为永久,不过时。
mysql> show variables like 'default_password_lifetime'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | default_password_lifetime | 0 | +---------------------------+-------+ 1 row in set (0.00 sec)
若是你要创建一个全局策略,让全部用户的密码的使用期限为六个月,可在服务端配置文件 my.cnf 中修改 default_password_lifetime
配置项的值为 180。
[mysqld] default_password_lifetime=180
若是你要恢复全局策略,让全部用户的密码永不过时,可在服务端配置文件 my.cnf 中修改 default_password_lifetime
配置项的值为 0。
[mysqld] default_password_lifetime=0
default_password_lifetime
参数是支持永久动态设置的,你也能够用如下命令在 MySQL 命令行下直接设置生效。
# 设置默认密码过时策略为 180 天后过时 mysql> SET PERSIST default_password_lifetime = 180; # 设置默认密码过时策略为永不过时 mysql> SET PERSIST default_password_lifetime = 0; # MySQL 8.0 永久动态修改参数会保存在配置文件 mysqld-auto.cnf 中,保存的格式为JSON串。 $ cat /var/lib/mysql/mysqld-auto.cnf { "Version" : 1 , "mysql_server" : { "default_password_lifetime" : { "Value" : "180" , "Metadata" : { "Timestamp" : 1525663928688419 , "User" : "root" , "Host" : "" } } } }
建立和修改带有密码过时时间的用户示例
建立或修改一个用户的密码过时时间为 90 天。
mysql> CREATE USER 'mike'@'%' IDENTIFIED BY '000000' PASSWORD EXPIRE INTERVAL 90 DAY; mysql> ALTER USER `mike`@`%` PASSWORD EXPIRE INTERVAL 90 DAY;
建立或修改一个用户的密码过时时间为永不过时。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE NEVER; mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE NEVER;
建立或修改一个遵循全局到期策略的用户。
mysql> CREATE USER 'mike'@'%' PASSWORD EXPIRE DEFAULT; mysql> ALTER USER 'mike'@'%' PASSWORD EXPIRE DEFAULT;
查看用户的密码过时时间。
mysql> select user,host,password_last_changed,password_lifetime,password_expired from mysql.user; +------------------+-----------+-----------------------+-------------------+------------------+ | user | host | password_last_changed | password_lifetime | password_expired | +------------------+-----------+-----------------------+-------------------+------------------+ | mike | % | 2018-05-07 11:13:39 | 90 | N | | root | % | 2018-05-04 16:46:05 | NULL | N | | mysql.infoschema | localhost | 2018-05-04 16:45:55 | NULL | N | | mysql.session | localhost | 2018-05-04 16:45:55 | NULL | N | | mysql.sys | localhost | 2018-05-04 16:45:55 | NULL | N | | root | localhost | 2018-05-04 16:46:05 | NULL | N | +------------------+-----------+-----------------------+-------------------+------------------+ 6 rows in set (0.00 sec)
用户管理
建立用户
create user '用户名'@'IP地址' identified by '密码';
删除用户
drop user '用户名'@'IP地址';
修改用户
rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';
修改密码
set password for '用户名'@'IP地址' = Password('新密码');
注:用户权限相关数据保存在mysql数据库的user表中,因此也能够直接对其进行操做(不建议)
建立用户
create user '用户名'@'IP地址' identified by '密码';
删除用户
drop user '用户名'@'IP地址';
修改用户
rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';
修改密码
set password for '用户名'@'IP地址' = Password('新密码');
注:用户权限相关数据保存在mysql数据库的user表中,因此也能够直接对其进行操做(不建议)
权限管理
mysql对于权限这块有如下限制:
all privileges:除grant外的全部权限 select:仅查权限 select,insert:查和插入权限 ... usage:无访问权限 alter:使用alter table alter routine:使用alter procedure和drop procedure create:使用create table create routine:使用create procedure create temporary tables:使用create temporary tables create user:使用create user、drop user、rename user和revoke all privileges create view:使用create view delete:使用delete drop:使用drop table execute:使用call和存储过程 file:使用select into outfile 和 load data infile grant option:使用grant 和 revoke index:使用index insert:使用insert lock tables:使用lock table process:使用show full processlist select:使用select show databases:使用show databases show view:使用show view update:使用update reload:使用flush shutdown:使用mysqladmin shutdown(关闭MySQL) super:使用change master、kill、logs、purge、master和set global。还容许mysqladmin调试登录 replication client:服务器位置的访问 replication slave:由复制从属使用
查看权限:
show grants for '用户'@'IP地址'
二、受权
grant 权限 on 数据库.表 to '用户'@'IP地址'
三、取消受权
revoke 权限 on 数据库.表 from '用户名'@'IP地址'
受权实例以下:
grant all privileges on db1.tb1 TO '用户名'@'IP' grant select on db1.* TO '用户名'@'IP' grant select,insert on *.* TO '用户名'@'IP' revoke select on db1.tb1 from '用户名'@'IP'
2.远程登录mysql服务器
mysql -uroot -p -h192.168.137.10 -P3306
3.查询数据库/显示数据库列表
show databases;
缺省有两个数据库:mysql和test。 mysql库存放着mysql的系统和用户权限信息,咱们改密码和新增用户,实际上就是对这个库进行操做。
4.进入某个数据库
use databasename; #切换数据库
show tables; #查看数据库所有表
select * from 表名; # 查看表全部内容
select * from test01 limit 10; #查看前十行。
select Host,User,Password from user; #查看Host,User,Password 三个字段
select * from test01 where name="xiao_111"; #在test01中查看xiao
select * from test01 where name="xiao_111" and age=21;
select * from test01 where like name="%xiao_111%" and age=21;
搜索延迟,没有添加索引,重复执行一次命令。
建立数据库:
create database db1 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; # utf8编码 create database db1 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; # gbk编码
查看某一个数据表,如表user
show createtable mysql.user;
或者show create table user;
或show create table mysql.user\G; (表的详细结构)
select curtime(); #返回当前的系统时间;
select now(); #返回当前的系统日期和时间;
show status like '%lock%'; # 查询锁状态;
show engine innodb status\Gshow master status\G # 查看show engine innodb status\G 查看最近死锁信息;show slave master 用于提供有关从属服务器线程的关键参数的信息
show variables like '%max_connection%'; #查看数据库链接数
set global max_connctions=500; #设置链接数为500;
set global innodb_stats_on_metadata=0 #设置并发处理数量为0
show processlist显示的状态里面,update表示正在insert ,updating表示正在delete,Updating才是表示正在update
查看表MySQL数据库的远程访问user的用户及密码
select host,user,password from mysql.user;
kill SESSION_ID; # 杀掉有问题的session;
select * from 表名 #查询表中的内容
show engines \G #查询该数据库支持的存储引擎类型 ss ; \g 、\G与”;“效果同样,
show variables like 'have%'; #查询MySQL支持的存储引擎;
show variables like 'storage_engine'; #查询默认存储引擎; 修改默认的引擎在my.ini配置文件中修改,将"mysqld部分存在efault-storage-engine=INNODB"更改成"default-engine=MyISAM"。而后重启服务修改生效。
show create table user \G; #查看user表的存储引擎以及表的内容
alter table test rename text #将test表改为text表。
将在表user中增长一个没有完整性约束的phone字段
alter table user modify name varchar(30); #修改字段数据类型为varchar(30);
增长无完整性约束条件的字段
alter table user add phone varchar(20); #在user表中增长一个没有完整性约束条件约束的phone字段
修改字段的排列位置
将user表中的name字段 修改成该表的第一个字段。
alter table user modify name varchar(30) first;
删除字段
从user表中删除id字段
alter table user drop id;
表的第一个位置增长字段
在user表中第一个位置增长num字段,并设置num字段为主键
alter table user add num int(8) primary key first;
表指定位置以后增长位置
在user表的phone字段后增长address字段,并设置address字段为非空。
alter table user add address varchar(30) not null after phone;
更改表的存储引擎
将user表的存储引擎改成MyISAM.
alter table user ENGINE=MyISAM
show create table user \G; #查看修改的结果
show index from t; 使用show语句查看t表上的索引:
show create table t\G 使用show create table语句查看索引:
增长有完整性约束条件的字段
将在user表中增长一个有非空约束的age字段,其数据类型为INT(4).
alter table user add age int(4) not null;
表的第一个位置增长字段
将在user表中第一个位置增长num字段,并设置num字段为主键。增长num字段,并设置num字段为主键。
alter table user add num int(8) primary key first;
删除字段
将user表中删除id字段
alter table user drop id;
常见报错
Multiple primary key defined
多主键定义
Duplicate column name 'num'
重复列名“num”
查看当前所在数据库
select database();
注意:若是一个用户没有一个表的任何权限,表将不在 SHOW TABLES 或 mysqlshowdb_name 中的输出中显示。
5.删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass 中编号为 1 的记录
mysql> delete from MyClass where id=1;
修改表中数据
命令:update 表名 set 字段=新值,… where 条件
mysql> update MyClass set name='Mary' where id=1;
在表中增长字段
命令:alter table 表名 add 字段 类型 其余;
例如:在表 MyClass 中添加了一个字段 passtest,类型为 int(4),默认值为 0
mysql> alter table MyClass add passtest int(4) default '0'
更改表名
命令:rename table 原表名 to 新表名;
例如:在表 MyClass 名字更改成 YouClass
mysql> rename table MyClass to YouClass;
更新字段内容
命令:update 表名 set 字段名 = 新内容
update 表名 set 字段名 = replace(字段名, '旧内容', '新内容');
例如:文章前面加入 4 个空格
update article set content=concat(' ', content);
删除pad列上的histogram:
mysql > analyze table test drop histogram on pad;
ANALYZE TABLE sbtest1 DROP HISTOGRAM ON pad;
直方图统计信息存储于InnoDB数据词典中,能够经过information_schema表来获取。
mysql>show create table information_schema.column_statistics\G
root@information_schema 05:34:49>SHOW CREATE TABLE INFORMATION_SCHEMA.COLUMN_STATISTICS\G *************************** 1. row *************************** View: COLUMN_STATISTICS Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`mysql.infoschema`@`localhost` SQL SECURITY DEFINER VIEW `COLUMN_STATISTICS` AS select `mysql`.`column_statistics`.`schema_name` AS `SCHEMA_NAME`,`mysql`.`column_statistics`.`table_name` AS `TABLE_NAME`,`mysql`.`column_statistics`.`column_name` AS `COLUMN_NAME`,`mysql`.`column_statistics`.`histogram` AS `HISTOGRAM` from `mysql`.`column_statistics` where can_access_table(`mysql`.`column_statistics`.`schema_name`,`mysql`.`column_statistics`.`table_name`) character_set_client: utf8 collation_connection: utf8_general_ci1 row in set (0.00 sec)
从column_statistics表的定义能够看到,有一个名为mysql.column_statistics系统表,但被隐藏了,没有对外暴露。
查询表上的直方图信息
>SELECT JSON_PRETTY(HISTOGRAM) FROM INFORMATION_SCHEMA.COLUMN_STATISTICS WHERE SCHEMA_NAME='sb1' AND TABLE_NAME = 'sbtest1'\G
将全局和session级别long_query_time设置为1.
> set global long_query_time=1;
> set session long_query_time=1;
例如,改变weight 的类型:
6.查看某个表所有字段
desc slow_log;
show create table slow_log\G; #查看表的类型(不只能够显示表信息,还能够显示建表语句)
7.查看当前用户
select user(); #查询当前用户
select User from mysql.user;root #用户登陆,查看全部用户
8.增长用户
mysql -uroot -pmysql; #链接到本机上的 MySQL。
mysql -h 127.0.0.1 -uroot -pmysql; #链接到远程主机上的 MYSQL。
修改新密码
在终端输入:
mysql -u用户名 -p密码,回车进入Mysql。 > use mysql; > update user set password=PASSWORD('新密码') where user='用户名'; > flush privileges; #更新权限 > quit; #退出
增长新用户
格式:
grant select on 数据库.* to 用户名@登陆主机 identified by '密码'
例子 :
例 1 : 增长一个用户 test1 密码为 abc,让他能够在任何主机上登陆,并对全部数据库有
查询、插入、修改、删除的权限。首先用以 root 用户连入 MySQL,而后键入如下命令:
mysql>grant select,insert,update,delete on *.* to root@localhost identified by 'mysql';
或者
grant all privileges on *.* to root@localhost identified by 'mysql';
而后刷新权限设置。
flush privileges;
例 2:若是你不想 root 有密码操做数据库“mydb”里的数据表,能够再打一个命令将密码消掉。
grant select,insert,update,delete on mydb.* to root@localhost identified by '';
删除用户
hadoop@ubuntu:~$ mysql -u用户名 -p密码 mysql>delete from user where user='用户名' and host='localhost'; mysql>flush privileges; //删除用户的数据库 mysql>drop database dbname;
9.建立新数据库(能够指定字符集)
create database db1 charset utf8;
建立GBK字符集数据库mingongge并查看完整建立语句 : create database mingongge default charset gbk collate gbk_chinese_ci;
建立用户mingongge使用之能够管理数据库mingongge : grant all on mingongge.* to 'mingongge'@'localhost' identified by 'mingongge';
查看建立用户mingongge的权限 : show grants for mingongge@localhost;
建立数据库:create database db01;
查看当前数据库有哪此用户 : select user from mysql.user;
使用/进入数据库: use db01;
建立用户:create user guest@localhost identified by '123456';
受权:grant select on mysql.* to guest@localhost identified by '123456';
grant select,insert,update,delete on *.* to user1@localhost Identified by "password1"; --此命令也能够做为修改密码的命令
建立用户并all权限给在test_gbk库全部表,密码‘123456’ #grant all on test_gbk.* to 'testuser'@'localhost' identified by '123456';
刷新权限,使权限生效 : flush privileges;
查看用户有哪些权限 : show grants for 'testuser'@'localhost';
收回权限 : revoke insert,update,select,delete on test_gbk.* from 'testuser'@'localhost';
10.建立新表
mysql >use student;
mysql > create table t1 (`id` int(4), `name` char(40));
mysql> show create table t1\G; #
##经过现有的表建立新表
mysql> create table T2 as select * from T1;
查看建表结构及表结构的SQL语句
desc test;
show create table test\G
插入一条数据“1,mingongge”
insert into test values('1','mingongge');
再批量插入2行数据“2,民工哥”,“3,mingonggeedu”
insert into test values('2','民工哥'),('3','mingonggeedu');
删除students表中的 id 为 3 的行: delete from students where id=3;
删除全部年龄小于 21 岁的数据: delete from students where age<20;
删除表中的全部数据: delete from students;
查询名字为mingongge的记录
select * from test where name = 'mingongge';
把数据id等于1的名字mingongge更改成mgg
update test set name = 'mgg' where id = '1';
把数据id等于2的age年龄更改成22(岁)
update test set age = '22' where id = '2';
update 语句可用来修改表中的数据, 简单来讲基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
如下是在表 students 中的实例 :
将 id 为 5 的手机号改成默认的 - : update students settel=default where id=5;
将全部人的年龄增长 1: update students set age=age+1;
将手机号为 13288097888 的姓名改成 "小明", 年龄改成 19: update students setname="小明", age=19 wheretel="13288097888";
在字段name前插入age字段,类型tinyint(2)
alter table test add age tinyint(2) after id;
不退出数据库,完成备份mingongge数据库
#system mysqldump -uroot -ppassword -B mingongge >/root/mingongge_bak.sql
实例 :
在数据库里,建立一个新的表
建立数据库 : create database students;
使用数据库 : use students;
建立student111表格 : create table student111(id int, name varchar(20),age int,phone char(11),height float(3,2));
查看student111 表的表结构 : desc student111;
下面的test表中建立了3个重复索引,在ID列上建了主键、惟一索引、普通索引。
create table test(
id int not null PRIMARY KEY,
A int not null,
B int not null,
UNIQUE(ID),
INDEX(ID)
)engine=innodb;
在student111表里面插入5条数据
insert student111 values(1,'li',21,'11011011011',1.72);
insert student111 values(2,'li',23,'11011011012',1.98);
insert student111 values(3,'li',42,'11011011013',1.60);
insert student111 values(4,'li',25,'11011011014',1.78);
insert student111 values(5,'li',28,'11011011015',1.89);
将student111表名修改成student_details
rename table student111 to student_details;
将student_details中的height字段删除
alter table student_details drop height;
在student_details里添加一个新字段,字段名为gender,并增长两条数据。
alter table student_details add gender char(5);
update student_details set gender='woman' where id = 1;
update student_details set gender='woman' where id = 2;
删除 student_details表
drop student_details;
create table teacher01(id int,name varchar(20),salary float(4,2));
插入数据 :(insert into 表名 value(内容))
GROUP BY子句的真正做用在于与各类聚合函数配合使用。它用来对查询出来的数据进行分组。
create table t_order(id int primary key,product varchar(20),price float(8,2));
insert into t_order values(1,'xiaomi', 1000);
insert into t_order values(2,'xiaomi',1100);
insert into t_order values(3,'huawei',2200);
insert into t_order values(4,'apple',8200);
1.对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from t_order GROUP BY product;
查询每一类商品总价格大于3000的商品
select product,sum(price) as total from t_order GROUP BY product HAVING total>3000;
WHERE是在分组(group by)前进行条件过滤,
HAVING子句是在分组(group by)后进行条件过滤,
WHERE子句中不能使用聚合函数,HAVING子句能够使用聚合函数。
11.删除表t和mingongge数据库并查看
drop table test;
show tables;
drop database mingongge;
show databases;
12.清空表数据
truncate table db1.t1;
删除test表中的全部数据,并查看
delete from test;
select * from test;
13.更改表的某一行数据
update db1.t1 set name='aaa' where id=1;
14.查询表数据
select * from mysql.db; //查询该表中的全部字段
select count(*) from mysql.user; //count(*)表示表中有多少行
select db,user from mysql.db; //查询表中的多个字段
select * from mysql.db where host like '10.0.%'; #在查询语句中能够使用万能匹配 “%”
15.清空数据库中的全部表(数据库名是eab12)
mysql -N -s information_schema -e "SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM TABLES WHERE TABLE_SCHEMA='eab12'" | mysql -f eab12
16.查看数据库版本
select version();
select batabase(); #查看当前链接的数据库,至关于pwd
select user(); #查看当前链接数据库的用户,至关于whoami
查看MySQL字符集
mysql> show variables like '%character%';
character_set_server 默认的内部操做字符集
character_set_client 客户端来源数据使用的字符集
character_set_connection 链接层字符集
character_set_results 查询结果字符集
character_set_database 当前选中数据库的默认字符集
character_set_system 系统元数据(字段名等)字符集
查看数据库编码
SHOW CREATE DATABASE db_name;
mysql> show create database wl;
查看表字符集编码
SHOW CREATE TABLE tbl_name;
查看字段字符集编码
mysql>show full columns from tbl_name
设置字符集编码(设置character_set_client、character_set_connection、character_set_results);
SET NAMES xxx; 例如 : set names gbk;
mysql> show variables like '%char%'; #查看现有字符集编码,设置好了,使用这个命令查看效果;
修改数据库字符集(只能改变后续建立表,没法改变已建立表)
ALTER DATABASE DATABASENAME CHARACTER SET XXX;
修改表的字符集
ALTER TABLE TABLENAME CHARACTER SET XXX;(只能改变后续添加数据)
ALTER TABLE TABLENAME CONVERT TO CHARACTER SET XXX;(所有从新写入)
修改列字符集
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE …];
mysql>SHOW FULL COLUMNS FROM emp;
mysql>ALTER TABLE emp CHANGE ename ename VARCHAR(10) CHARACTER SET utf8;
mysql>SHOW FULL COLUMNS FROM emp;
17.查看数据库状态
show status; 当前会话状态
show global status; 全局数据库状态
show slave status\G; 查看主从数据库状态信息
show tables; 显示当前库全部表
Show Databases; 显示全部数据库
18.查询数据库参数
show variables;
19.修改数据库参数
show variables like 'max_connect%';
set global max_connect_errors = 1000;(重启数据库会失效,要在配置文件中修改)
20.查看当前数据库队列
show processlist;
21.建立普通用户并受权给某个数据库
grant all on databasename.* to 'user1'@'localhost' identified by '123456';
22.插入一行数据
insert into db1.t1 values (1, 'abc');19.
23.删除数据库
drop database db1;
24.数据库备份
mysqldump -uroot -p'yourpassword' mysql >/tmp/mysql.sql
25.数据库恢复
mysql -uroot -p'yourpassword' mysql </tmp/mysql.sql
26.新建普通用户
CREATE USER name IDENTIFIED BY 'ssapdrow';
27.更改普通用户密码
SET PASSWORD FOR name=PASSWORD('fdddfd');
28.查看name用户权限
SHOW GRANTS FOR name;
29.脚本中执行mysql命令
mysql -uuser -ppasswd -e"show databases"
echo "show databases"|mysql -uuser -ppassword
如下是执行大量mysql语句采用的方式
mysql -uuser -hhostname -ppasswd <<EOF
mysql语句
EOF
mysql> -- 下面咱们另外添加一个新的 root 用户, 密码为空, 只容许 192.168.1.100 链接
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
mysql> -- @'192.168.1.100'能够替换为@‘%’就可任意ip访问,固然咱们也能够直接用 UPDATE 更新 root 用户 Host, 但不推荐, SQL以下:
mysql> -- UPDATE user SET Host='192.168.1.100' WHERE User='root' AND Host='localhost' LIMIT 1;
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
30、授全部权:
grant all privileges on icsdb1.* to iccard@'%' Identified by 'iccard' WITH GRANT OPTION;(其余ip访问)
grant all privileges on icsdb1.* to iccard@'localhost' Identified by 'iccard' WITH GRANT OPTION;(本机访问)
3一、显示库中的数据表:
use mysql;
show tables;
3二、显示数据表的结构:
show tables; #列出数据库中全部的表
describe 表名; #获取表结构
desc 表名; #获取表结构
show columns from 表名; #获取表结构
3三、建库与删库:
create database 库名;
drop database 库名;
3四、建表:
use 库名;
create table 表名(字段列表);
drop table 表名;
3五、清空表中记录:
delete from 表名;
3六、显示表中的记录:
select * from 表名;
3七、mysql导出数据库
>mysqldump -h localhost -u dev01 -p ecmall>~/20091127_ecmall.sql
导出数据表
3八、MySQL最大链接数设置
MySQL的最大链接数默认是100
客户端登陆:mysql -uusername -ppassword
设置新的最大链接数为200:mysql> set GLOBAL max_connections=200
显示当前运行的Query:mysql> show processlist
显示当前状态:mysql> show status
退出客户端:mysql> exit
查看当前最大链接数:mysqladmin -uusername -ppassword variables |find "max_con"
3九、按字符集导出
$mysqldump -u root -p dbname --default-character-set=gbk > a.sql;
40、单独设置某个数据库字符集:
alter database testdb character set utf8;
4一、查看mysql支持的编码:
show character set;
4二、查看系统的字符集和排序方式的设定能够经过下面的两条命令:
mysql> SHOW VARIABLES LIKE ''character_set_%'';
4三、导出数据
$ mysqldump -u root -p dbname --default-character-set=gbk > base_user.sql;
单库备份
4四、# mysqldump -uroot -p test >/download/testbak_$(date +%F).sql
# ll /download/ #查看生成的以日期为名字的数据库
# egrep -v "^--|\*|^$" /download/testbak_2016-12-12.sql #查看备份文件内容
# mysqldump -uroot -p -B test >/download/testbak_$(date +%F)_b.sql
-B参数的做用一目了然,就是当咱们的数据库丢失时,能够直接用此备份文件进行恢复,无需再从新建库、建表,而后再进行数据恢复的操做
# mysqldump -uroot -p -B test|gzip >/download/testbak_$(date +%F).sql.gz
# ll /download/testbak_2016-12-12.sql.gz
# mysqldump -uroot -p -B test mysql|gzip >/download/testbak_$(date +%F).sql01.gz
#mysqldump -uroot -p -B --events test mysql|gzip >/download/testbak_$(date +%F).sql02.gz #-B忽略备份过程的提示信息 , 此备份方法不经常使用
# ll /download/testbak_2016-12-12.sql02.gz
多库备份时就须要进行屡次单库备份的操做
# mysqldump -uroot -p -B test|gzip >/download/testbackup_$(date +%F).sql.gz
# mysqldump -uroot -p -B --events mysql|gzip >/download/mysqlbak_$(date +%F).sql.gz
# ll /download/
分库备份是为了恢复数据库时方便操做,可是一样面临问题,若是是某个库中的某一个表有损坏,但又不有全库进行恢复,因此实际生产中经常使用的是分库、分表进行备份,这样数据也备份了,恢复时也好操做。
# mysqldump -uroot -p -B test test >/download/test_testbak_$(date +%F).sql
# egrep -v "#|^$|\*" /download/test_testbak_2016-12-12.sql
4五、建立一个innodb GBK表test,字段id int(4)和name varchar(16)
create table test (
id int(4),
name varchar(16)
)ENGINE=innodb DEFAULT CHARSET=gbk
4六、 用 Alter Table 语句建立与删除索引
为了给现有的表增长一个索引,可使用 ALTER TABLE 或 CREATE INDEX 语句。
ALTER TABLE 最经常使用,由于可用它来建立普通索引、UNIQUE 索引或 PRIMARY KEY
索引,如:
ALTER TABLE tbl_name ADD INDEX index_name (column_list);
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
ALTER TABLE tbl_name ADD PRIMARY KEY index_name (column_list);
其中 tbl_name 是要增长索引的表名,而 column_list 指出对哪些列进行索引。一个
(col1,col2,...)形式的列表创造一个多列索引。索引值有给定列的值串联而成。若是索引由不止一列组成,各列名之间用逗号分隔。索引名 index_name 是可选的,所以能够不写它,MySQL 将根据第一个索引列赋给它一个名称。ALTER TABLE 容许在单个语句中指定多个表的更改,所以能够在同时建立多个索引。
一样,也能够用 ALTER TABLE语句产出列的索引:
ALTER TABLE tbl_name DROP INDEX index_name;
ALTER TABLE tbl_name DROP PRIMARY KEY;
增长索引以前和以后
建这样的索引,以加速表的检
索速度:
mysql> ALTER TABLE student
-> ADD PRIMARY KEY(id),
-> ADD INDEX mark(english,Chinese,history);
注意 : 记住,使用 PRIMARY索引的列,必须是一个具备 NOT NULL属性的列,若是你愿意产看建立的索引的状况,能够使用SHOW INDEX 语句:mysql> SHOW INDEX FROM student;
再使用 ALTER TABLE 语句删除索引,删除索引须要知道索引的名字,你能够经过
SHOW INDEX 语句获得:
mysql> ALTER TABLE student DROP PRIMARY KEY,
-> DROP INDEX mark;
再产看表中的索引,其语句和输出为:
mysql> SHOW INDEX FROM student;
Empty set (0.01 sec)
用 CREATE\DROP INDEX 建立索引
利用 ALTER TABLE 语句建立索引(MySQL一般在内部将 CREATE INDEX 映射到 ALTER TABLE)。该语句建立索引的语法以下:
CREATE UNIQUE INDEX index_name ON tbl_name (column_list)
CREATE INDEX index_name ON tbl_name (column_list)
tbl_name、index_name 和 column_list 具备与 ALTER TABLE 语句中相同的含义。这里索引名不可选。很明显,CREATE INDEX 可对表增长普通索引或 UNIQUE 索引,不能用 CREATE INDEX 语句建立 PRIMARY KEY 索引。
可利用 DROP INDEX 语句来删除索引。相似于 CREATE INDEX 语句,DROP INDEX一般在内部做为一条 ALTER TABLE 语句处理,
删除索引语句的语法以下:
DROP INDEX index_name ON tbl_name
因为 CREATE INDEX 不能建立 PRIMARY索引,须要建立一个多列索引。
ysql> CREATE INDEX mark ON student(english,chinese,history);
一样的检查 student 表,可知:
mysql> SHOW INDEX FROM student;
使用下面的语句删除索引:
mysql> DROP INDEX mark ON student;
在建立表时指定索引
在发布 CREATE TABLE 语句时为新表建立索引,
在定义表列的语句部分指定索引建立子句,以下所示:
CREATE TABLE tbl_name
(
INDEX index_name (column_list),
KEY index_name (column_list),
UNIQUE index_name (column_list),
PRIMARY KEY index_name (column_list),
)
增长 PRIMARY KEY 建立一个单列的 PRIMARY
KEY 索引,以下所示:
CREATE TABLE tbl_name
(
i INT NOT NULL PRIMARY KEY
)
该语句等价于如下的语句:
CREATE TABLE tbl_name
(
i INT NOT NULL,
PRIMARY KEY (i)
);
对索引列指定了 NOT NULL。若是是 ISAM 表,这是必须的,
由于不能对可能包含 NULL 值的列进行索引。若是是 MyISAM 表,索引列能够为 NULL,只要该索引不是 PRIMARY KEY 索引便可。
在 CREATE TBALE语句中能够某个串列的前缀进行索引(列值的最左边 n 个字符)
若是对某个串列的前缀进行索引,应用 column_list 说明符表示该列的语法为
col_name(n) 而不用col_name。例如,下面第一条语句建立了一个具备两个 CHAR 列的表
和一个由这两列组成的索引。第二条语句相似,但只对每一个列的前缀进行索引:
CREATE TABLE tbl_name
(
name CHAR(30),
address CHAR(60),
INDEX (name,address)
)
CREATE TABLE tbl_name
(
name CHAR(30),
address CHAR(60),
INDEX (name(10),address(20))
);
4七、增长与删除列
mysql> alter table T1 add age int(4) not null;
mysql> alter table T1 drop age
4八、更新表里的数据
mysql> update T1 set age=25 where name='zhang';
mysql> update T1 set age=23 where name='li';
4九、删除数据
mysql> delete from T1 where age='22';
建索引与删除
mysql> create index indexT1 on T1(name(10));
mysql> drop index indexT1 on T1;
50、建立主键
mysql> alter table T1 add primary key(name);
mysql> desc T1;
5一、建立与删除视图
mysql> create view t1view as select name from T1;
mysql> select * from t1view;
删除视图
mysql> drop view t1view;
mysql> select * from t1view;
ERROR 1146 (42S02): Table 'student.t1view' doesn't exist
###提示此视图不存在
查看视图
show table status like '视图名' \G; #查看视图基本信息
showcreate view 视图名 \G; #查看视图详细信息
select * from information_schema.views \G; #查询 information_schema数据库下的views表;
CREATE OR REPLACE VIW #语句修改视图
显示department_view1有3个属性,分别是department、function、localtion属性。
truncate 删除数据,致使自动清空自增ID,前端返回报错 not found。
这个问题的出现,就要考虑下 truncate 和 delete 的区别了。
看下实验演练:
首先先建立一张表
CREATE TABLE `t` ( `a` int(11) NOT NULL AUTO_INCREMENT, `b` varchar(20) DEFAULT NULL, PRIMARY KEY (`a`), KEY `b` (`b`) ) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8
先用 delete 进行删除全表信息,再插入新值。
结果发现 truncate 把自增初始值重置了,自增属性从1开始记录了。当前端用主键id进行查询时,就会报没有这条数据的错误。
我的建议不要使用 truncate 对表进行删除操做,虽然能够回收表空间,可是会涉及自增属性问题。这些坑,咱们不要轻易钻进去。
5二、查找表里面的数据
表名:person_tbl )
查找name字段中以'st'为开头的全部数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
查找name字段中以'ok'为结尾的全部数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
查找name字段中包含'mar'字符串的全部数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'mar';
查找name字段中以元音字符开头或以'ok'字符串结尾的全部数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';
5三、事务测试
MySQL 事务主要用于处理操做量大,复杂度高的数据。好比说,在人员管理系统中,你删除一我的员,你即须要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操做语句就构成一个事务!
MYSQL 事务处理主要有两种方法:
一、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
二、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 建立数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 由于回滚因此数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql>
5四、MySQL ALTER命令
当咱们须要修改数据表名或者修改数据表字段时,就须要使用到MySQL ALTER命令。
先建立一张表,表名为:testalter_tbl。
mysql> use RUNOOB;
Database changed
mysql> create table testalter_tbl
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
以下命令使用了 ALTER 命令及 DROP 子句来删除以上建立表的 i 字段:
mysql> ALTER TABLE testalter_tbl DROP i;
若是数据表中只剩余一个字段则没法使用DROP来删除字段。
MySQL 中使用 ADD 子句来向数据表中添加列,以下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:
mysql> ALTER TABLE testalter_tbl ADD i INT;
执行以上命令后,i 字段会自动添加到数据表字段的末尾。
mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
若是你须要指定新增字段的位置,能够使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段以后)。
尝试如下 ALTER TABLE 语句, 在执行成功后,使用 SHOW COLUMNS 查看表结构的变化:
ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT FIRST; ALTER TABLE testalter_tbl DROP i; ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句,因此若是你想重置数据表字段的位置就须要先使用 DROP 删除字段而后使用 ADD 来添加字段并设置位置。
若是须要修改字段类型及名称, 你能够在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
例如,把字段 c 的类型从 CHAR(1) 改成 CHAR(10),能够执行如下命令:
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
使用 CHANGE 子句, 语法有很大的不一样。 在 CHANGE 关键字以后,紧跟着的是你要修改的字段名,而后指定新字段名及类型。尝试以下实例:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
当你修改字段时,你能够指定是否包含值或者是否设置默认值。
如下实例,指定字段 j 为 NOT NULL 且默认值为100 。
mysql> ALTER TABLE testalter_tbl -> MODIFY j BIGINT NOT NULL DEFAULT 100;
若是你不设置默认值,MySQL会自动设置该字段默认为 NULL。
你能够使用 ALTER 来修改字段的默认值,尝试如下实例:
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | 1000 | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
你也能够使用 ALTER 命令及 DROP子句来删除字段的默认值,以下实例:
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT; mysql> SHOW COLUMNS FROM testalter_tbl; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec) Changing a Table Type:
修改数据表类型,能够使用 ALTER 命令及 TYPE 子句来完成。尝试如下实例,咱们将表 testalter_tbl 的类型修改成 MYISAM :
注意:查看数据表类型能够使用 SHOW TABLE STATUS 语句。
mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM; mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G *************************** 1. row **************** Name: testalter_tbl Type: MyISAM Row_format: Fixed Rows: 0 Avg_row_length: 0 Data_length: 0 Max_data_length: 25769803775 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2007-06-03 08:04:36 Update_time: 2007-06-03 08:04:36 Check_time: NULL Create_options: Comment: 1 row in set (0.00 sec)
若是须要修改数据表的名称,能够在 ALTER TABLE 语句中使用 RENAME 子句来实现。
尝试如下实例将数据表 testalter_tbl 重命名为 alter_tbl:
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
alter其余用途:
修改存储引擎:修改成myisam
alter table tableName engine=myisam;
删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;
修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,first和after二选一,这应该显而易见,first放在第一位,after放在name2字段后面
alter table tableName modify name1 type1 first|after name2;
5五、MySQL 索引
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表能够有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
建立索引时,你须要确保该索引是应用在 SQL 查询语句的条件(通常做为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
更新表时,MySQL不只要保存数据,还要保存一下索引文件。
创建索引会占用磁盘空间的索引文件。
普通索引
CREATE INDEX indexName ON mytable(username(length));
若是是CHAR,VARCHAR类型,length能够小于字段实际长度;若是是BLOB和TEXT类型,必须指定 length。
ALTER table tableName ADD INDEX indexName(columnName)
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
它与前面的普通索引相似,不一样的就是:索引列的值必须惟一,但容许有空值。若是是组合索引,则列值的组合必须惟一。它有如下几种建立方式:
首先建立一个表:create table t1 (id int primary key,username varchar(20),password varchar(20));
索引名通常是:表名_字段名
建立单个索引的语法:CREATE INDEX 索引名 on 表名(字段名)
CREATE UNIQUE INDEX indexName ON mytable(username(length)) ,
ALTER table mytable ADD UNIQUE [indexName] (username(length))
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
给id建立索引:CREATE INDEX t1_id on t1(id);
给username和password建立联合索引:CREATE index t1_username_password ON t1(username,password);
其中index还能够替换成unique,primary key,分别表明惟一索引和主键索引;
注意 : 索引列的基数越大,数据区分度越高,索引的效果越好。
避免建立过多的索引,索引会额外占用磁盘空间,下降写操做效率。
主键尽量选择较短的数据类型,能够有效减小索引的磁盘占用提升查询效率。
一个表只能有一个主键索引,可是能够有多个惟一索引。
主键索引必定是惟一索引,惟一索引不是主键索引。
联合索引:将多个列组合在一块儿建立索引,能够覆盖多个列。(也叫复合索引,组合索引)
外键索引:只有InnoDB类型的表才能够使用外键索引,保证数据的一致性、完整性、和实现级联操做(基本不用)。
全文索引:MySQL自带的全文索引只能用于MyISAM,而且只能对英文进行全文检索 (基本不用)
ALTER TABLE table_name DROP INDEX index_name; DROP INDEX [indexName] ON mytable;
例如删除名称为idx_cust_name的索引,其SQL语句为:
ALTER TABLE customers
DROP INDEX idx_cust_name;
修改索引
在MySQL中并无提供修改索引的直接指令,通常状况下,咱们须要先删除掉原索引,再根据须要建立一个同名的索引,从而变相地实现修改索引操做。
--先删除
ALTER TABLE user
DROP INDEX idx_user_username;
--再以修改后的内容建立同名索引
CREATE INDEX idx_cust_name ON customers (cust_name(8));
查看索引
在MySQL中,要查看某个数据库表中的索引也很是简单,只须要使用如下两个命令中的任意一种便可。
--若是查看索引前,没有使用user db_name等命令指定具体的数据库,则必须加上FROM db_name
SHOW INDEX FROM table_name [FROM db_name]
--若是查看索引前,没有使用user db_name等命令指定具体的数据库,则必须加上db_name.前缀
SHOW INDEX FROM [db_name.]table_name
有四种方式来添加数据表的索引:
实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
在 ALTER 命令中使用 DROP 子句来删除索引。尝试如下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
主键只能做用于一个列上,添加主键索引时,你须要确保该主键默认不为空(NOT NULL)。实例以下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也能够使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
使用 SHOW INDEX 命令来列出表中的相关的索引信息。能够经过添加 \G 来格式化输出信息。
尝试如下实例:
mysql> SHOW INDEX FROM table_name; \G ........
MySQL 临时表在咱们须要保存一些临时数据时是很是有用的。临时表只在当前链接可见,当关闭链接时,Mysql会自动删除表并释放全部空间。
实例
mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec)
当你使用 SHOW TABLES命令显示数据表列表时,你将没法看到 SalesSummary表。
若是你退出当前MySQL会话,再使用 SELECT命令来读取原先建立的临时表数据,那你会发现数据库中没有该表的存在,由于在你退出时该临时表已经被销毁了。
默认状况下,当你断开与数据库的链接后,临时表就会自动被销毁。固然你也能够在当前MySQL会话使用 DROP TABLE 命令来手动删除临时表。
手动删除临时表的实例:
mysql> CREATE TEMPORARY TABLE SalesSummary ( -> product_name VARCHAR(50) NOT NULL -> , total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00 -> , avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00 -> , total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO SalesSummary -> (product_name, total_sales, avg_unit_price, total_units_sold) -> VALUES -> ('cucumber', 100.25, 90, 2); mysql> SELECT * FROM SalesSummary; +--------------+-------------+----------------+------------------+ | product_name | total_sales | avg_unit_price | total_units_sold | +--------------+-------------+----------------+------------------+ | cucumber | 100.25 | 90.00 | 2 | +--------------+-------------+----------------+------------------+ 1 row in set (0.00 sec) mysql> DROP TABLE SalesSummary; mysql> SELECT * FROM SalesSummary; ERROR 1146: Table 'RUNOOB.SalesSummary' doesn't exist
彻底的复制MySQL的数据表,包括表的结构,索引,默认值等。 若是仅仅使用CREATE TABLE ... SELECT 命令,是没法实现的。
完整的复制MySQL数据表,步骤以下:
尝试如下实例来复制表 runoob_tbl 。
步骤一:
获取数据表的完整结构。
mysql> SHOW CREATE TABLE runoob_tbl \G; *************************** 1. row *************************** Table: runoob_tbl Create Table: CREATE TABLE `runoob_tbl` ( `runoob_id` int(11) NOT NULL auto_increment, `runoob_title` varchar(100) NOT NULL default '', `runoob_author` varchar(40) NOT NULL default '', `submission_date` date default NULL, PRIMARY KEY (`runoob_id`), UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`) ) ENGINE=InnoDB 1 row in set (0.00 sec) ERROR: No query specified
步骤二:
修改SQL语句的数据表名,并执行SQL语句。
mysql> CREATE TABLE `clone_tbl` ( -> `runoob_id` int(11) NOT NULL auto_increment, -> `runoob_title` varchar(100) NOT NULL default '', -> `runoob_author` varchar(40) NOT NULL default '', -> `submission_date` date default NULL, -> PRIMARY KEY (`runoob_id`), -> UNIQUE KEY `AUTHOR_INDEX` (`runoob_author`) -> ) ENGINE=InnoDB; Query OK, 0 rows affected (1.80 sec)
步骤三:
执行完第二步骤后,你将在数据库中建立新的克隆表 clone_tbl。 若是你想拷贝数据表的数据你能够使用INSERT INTO... SELECT 语句来实现。
mysql> INSERT INTO clone_tbl (runoob_id, -> runoob_title, -> runoob_author, -> submission_date) -> SELECT runoob_id,runoob_title, -> runoob_author,submission_date -> FROM runoob_tbl; Query OK, 3 rows affected (0.07 sec) Records: 3 Duplicates: 0 Warnings: 0
执行以上步骤后,你将完整的复制表,包括表结构及表数据。
CREATE TABLE targetTable LIKE sourceTable; INSERT INTO targetTable SELECT * FROM sourceTable;
其余:
能够拷贝一个表中其中的一些字段:
CREATE TABLE newadmin AS ( SELECT username, password FROM admin )
能够将新建的表的字段更名:
CREATE TABLE newadmin AS ( SELECT id, username AS uname, password AS pass FROM admin )
能够拷贝一部分数据:
CREATE TABLE newadmin AS ( SELECT * FROM admin WHERE LEFT(username,1) = 's' )
能够在建立表的同时定义表中的字段信息:
CREATE TABLE newadmin ( id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY ) AS ( SELECT * FROM admin )
注意 :
区分下mysql复制表的两种方式。
第1、只复制表结构到新表
create table 新表 select * from 旧表 where 1=2
或者
create table 新表 like 旧表
第2、复制表结构及数据到新表
create table新表 select * from 旧表
mySQL 序列是一组整数:1, 2, 3, ...,因为一张数据表只能有一个字段自增主键, 若是你想实现其余字段也实现自动增长,就能够使用MySQL序列来实现。
MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。
如下实例中建立了数据表 insect, insect 表中 id 无需指定值可实现自动增加。
mysql> CREATE TABLE insect -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, # type of insect -> date DATE NOT NULL, # date collected -> origin VARCHAR(30) NOT NULL # where collected ); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO insect (id,name,date,origin) VALUES -> (NULL,'housefly','2001-09-10','kitchen'), -> (NULL,'millipede','2001-09-10','driveway'), -> (NULL,'grasshopper','2001-09-10','front yard'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM insect ORDER BY id; +----+-------------+------------+------------+ | id | name | date | origin | +----+-------------+------------+------------+ | 1 | housefly | 2001-09-10 | kitchen | | 2 | millipede | 2001-09-10 | driveway | | 3 | grasshopper | 2001-09-10 | front yard | +----+-------------+------------+------------+ 3 rows in set (0.00 sec)
在MySQL的客户端中你能够使用 SQL中的LAST_INSERT_ID( ) 函数来获取最后的插入表中的自增列的值。
若是你删除了数据表中的多条记录,并但愿对剩下数据的AUTO_INCREMENT列进行从新排列,那么你能够经过删除自增的列,而后从新添加来实现。 不过该操做要很是当心,若是在删除的同时又有新记录添加,有可能会出现数据混乱。操做以下所示:
mysql> ALTER TABLE insect DROP id; mysql> ALTER TABLE insect -> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, -> ADD PRIMARY KEY (id);
通常状况下序列的开始值为1,但若是你须要指定一个开始值100,那咱们能够经过如下语句来实现:
mysql> CREATE TABLE insect -> ( -> id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id), -> name VARCHAR(30) NOT NULL, -> date DATE NOT NULL, -> origin VARCHAR(30) NOT NULL )engine=innodb auto_increment=100 charset=utf8;
或者你也能够在表建立成功后,经过如下语句来实现:
mysql> ALTER TABLE t AUTO_INCREMENT = 100;
在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(惟一) 索引来保证数据的惟一性。
实例:下表中无索引及主键,因此该表容许出现多条重复记录。
CREATE TABLE person_tbl ( first_name CHAR(20), last_name CHAR(20), sex CHAR(10) );
若是想设置表中字段 first_name,last_name 数据不能重复,能够设置双主键模式来设置数据的惟一性, 若是设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。以下所示:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), PRIMARY KEY (last_name, first_name) );
若是设置了惟一索引,那么在插入重复数据时,SQL 语句将没法执行成功,并抛出错。
INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,若是数据库没有数据,就插入新的数据,若是有数据的话就跳过这条数据。这样就能够保留数据库中已经存在数据,达到在间隙中插入数据的目的。
如下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 1 row affected (0.00 sec) mysql> INSERT IGNORE INTO person_tbl (last_name, first_name) -> VALUES( 'Jay', 'Thomas'); Query OK, 0 rows affected (0.00 sec)
INSERT IGNORE INTO 当插入数据时,在设置了记录的惟一性后,若是插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 若是存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
另外一种设置数据的惟一性方法是添加一个 UNIQUE 索引,以下所示:
CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, sex CHAR(10), UNIQUE (last_name, first_name) );
如下将统计表中 first_name 和 last_name的重复记录数:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM person_tbl -> GROUP BY last_name, first_name -> HAVING repetitions > 1;
以上查询语句将返回 person_tbl 表中重复的记录数。 通常状况下,查询重复的值,请执行如下操做:
若是你须要读取不重复的数据能够在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。
mysql> SELECT DISTINCT last_name, first_name -> FROM person_tbl;
也能够使用 GROUP BY 来读取数据表中不重复的数据:
mysql> SELECT last_name, first_name -> FROM person_tbl -> GROUP BY (last_name, first_name);
若是你想删除数据表中的重复数据,你能够使用如下的SQL语句:
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex); mysql> DROP TABLE person_tbl; mysql> ALTER TABLE tmp RENAME TO person_tbl;
固然也能够在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法以下:
mysql> ALTER IGNORE TABLE person_tbl -> ADD PRIMARY KEY (last_name, first_name);
select 列名1,count(1) as count from 表名 group by 列名1 having count>1 and 其余条件 select 列名1,列名2,count(1) as count from 表名 group by 列名1,列名2 having count>1 and 其余条件
原理:先按照要查询出现重复数据的列,进行分组查询。count > 1 表明出现 2 次或 2 次以上。
示例:
/*查询重复数据*/ select serialnum,cdate,count(*) as count from m_8_customer_temp_20180820bak group by serialnum,cdate having count>1 and cdate>='2018-08-20 00:00:00';
60、MySQL 排序咱们知道从 MySQL 表中使用 SQL SELECT 语句来读取:
MySQL 拼音排序
若是字符集采用的是 gbk(汉字编码字符集),直接在查询语句后边添加 ORDER BY:
SELECT * FROM runoob_tbl ORDER BY runoob_title;
若是字符集采用的是 utf8(万国码),须要先对字段进行转码而后排序:
SELECT * FROM runoob_tbl ORDER BY CONVERT(runoob_title using gbk);
6一、建立数据表 runoob_test_tbl
mysql> use RUNOOB;
Database changed
mysql> create table runoob_test_tbl
-> (
-> runoob_author varchar(40) NOT NULL,
-> runoob_count INT -> );
Query OK, 0 rows affected (0.05 sec)
mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('RUNOOB', 20);
mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('菜鸟教程', NULL);
mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('Google', NULL);
mysql> insert into runoob_test_tbl (runoob_author, runoob_count) values ('FK', 20);
mysql> select * from runoob_test_tbl;
+------------------+-------------------+
| runoob_author | runoob_count |
+---------------+---------------------+
| RUNOOB | 20 |
| 菜鸟教程 | NULL |
| Google | NULL |
| FK | 20 |
+------------------+------------------+
4 rows in set (0.01 sec)
查找数据表中 runoob_test_tbl 列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL,以下实例:
mysql> select * from runoob_test_tbl WHERE runoob_count IS NULL;
+----------------+----------------+
| runoob_author | runoob_count |
+-----------------+----------------+
| 菜鸟教程 | NULL |
| Google | NULL |
+---------------+------------------+
2 rows in set (0.01 sec)
mysql> select * from runoob_test_tbl WHERE runoob_count IS NOT NULL;
+----------------+-----------------+
| runoob_author | runoob_count |
+----------------+----------------+
| RUNOOB | 20 |
| FK | 20 |
+----------------+---------------+
2 rows in set (0.01 sec)
6二、MySQL 及 SQL 注入
SQL注入,就是经过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
咱们永远不要信任用户的输入,咱们必须认定用户输入的数据都是不安全的,咱们都须要对用户输入的数据进行过滤处理。
实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
让咱们看下在没有过滤特殊字符时,出现的SQL状况:
// 设定$name 中插入了咱们不须要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
没有对 $name 的变量进行过滤,$name 中插入了咱们不须要的SQL语句,将删除 users 表中的全部数据。
在PHP中的 mysqli_query() 是不容许执行多个 SQL 语句的,可是在 SQLite 和 PostgreSQL 是能够同时执行多条SQL语句的,因此咱们对这些用户的数据须要进行严格的验证。
如下实例中咱们将数据表 runoob_tbl 数据导出到 /tmp/runoob.txt 文件中 :
mysql> SELECT * FROM runoob_tbl -> INTO OUTFILE '/tmp/runoob.txt';
你能够经过命令选项来设置数据输出的指定格式,如下实例为导出 CSV 格式:
mysql> SELECT * FROM passwd INTO OUTFILE '/tmp/runoob.txt' -> FIELDS TERMINATED BY ',' ENCLOSED BY '"' -> LINES TERMINATED BY '\r\n';
在下面的例子中,生成一个文件,各值用逗号隔开。这种格式能够被许多程序使用。
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头从新建立数据库所必需的命令 CREATE TABLE INSERT 等。
使用 mysqldump 导出数据须要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。
如下实例将数据表 runoob_tbl 导出到 /tmp 目录中:
$ mysqldump -u root -p --no-create-info \ --tab=/tmp RUNOOB runoob_tbl password ******
导出 SQL 格式的数据到指定文件,以下所示:
$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt password ******
以上命令建立的文件内容以下:
-- MySQL dump 8.23 -- -- Host: localhost Database: RUNOOB --------------------------------------------------------- -- Server version 3.23.58 -- -- Table structure for table `runoob_tbl` -- CREATE TABLE runoob_tbl ( runoob_id int(11) NOT NULL auto_increment, runoob_title varchar(100) NOT NULL default '', runoob_author varchar(40) NOT NULL default '', submission_date date default NULL, PRIMARY KEY (runoob_id), UNIQUE KEY AUTHOR_INDEX (runoob_author) ) TYPE=MyISAM; -- -- Dumping data for table `runoob_tbl` -- INSERT INTO runoob_tbl VALUES (1,'Learn PHP','John Poul','2007-05-24'); INSERT INTO runoob_tbl VALUES (2,'Learn MySQL','Abdul S','2007-05-24'); INSERT INTO runoob_tbl VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');
若是你须要导出整个数据库的数据,能够使用如下命令:
$ mysqldump -u root -p RUNOOB > database_dump.txt password ******
若是须要备份全部数据库,能够使用如下命令:
$ mysqldump -u root -p --all-databases > database_dump.txt password ******
--all-databases 选项在 MySQL 3.23.12 及之后版本加入。
该方法可用于实现数据库的备份策略。
在源主机上执行如下命令,将数据备份至 dump.txt 文件中:
$ mysqldump -u root -p database_name table_name > dump.txt password *****
若是完整备份数据库,则无需使用特定的表名称。
若是你须要将备份的数据库导入到MySQL服务器中,能够使用如下命令,使用如下命令你须要确认数据库已经建立:
$ mysql -u root -p database_name < dump.txt password *****
你也能够使用如下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是能够相互访问的:
$ mysqldump -u root -p database_name \ | mysql -h other-host.com database_name
以上命令中使用了管道来将导出的数据导入到指定的远程主机上。
a、导出数据库(没有数据)
mysqldump -uroot -p123456 --opt --add-drop-table --add-drop-database -d -B db >db.nodata.sql //-d no data;
mysqldump -uroot -p123456 --opt --add-drop-table --add-drop-database -B db >db.sql //struct and data
b、查询数据库中记录不为空的表
use information_schema;
select * from TABLES where TABLE_ROWS>0 AND TABLE_SCHEMA='db';
mysqldump -uroot -p123456 db version >db-version.sql //导出db数据库version表的结构和数据
d、mysql跨库查询(连库查询)
select subscriber.username,subscriber.password, member.email from db.subscriber,db2.member where subscriber.username=member.id and member.book_id='193' limit 20;
select subscriber.username,subscriber.password, member.email,member.book_id from db.subscriber,db2.member where subscriber.username=member.id and member.book_id='193';
一、mysql 命令导入
使用 mysql 命令导入语法格式为:
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
实例:
# mysql -uroot -p123456 < runoob.sql
以上命令将将备份的整个数据库 runoob.sql 导入。
二、source 命令导入
source 命令导入数据库须要先登陆到数库终端:
mysql> create database abc; # 建立数据库 mysql> use abc; # 使用已建立的数据库 mysql> set names utf8; # 设置编码 mysql> source /home/abc/abc.sql # 导入备份数据库
三、使用 LOAD DATA 导入数据
MySQL 中提供了LOAD DATA INFILE语句来插入数据。 如下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
若是指定LOCAL关键词,则代表从客户主机上按路径读取文件。若是没有指定,则文件在服务器上按路径读取文件。
能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,可是默认标记是定位符和换行符。
两个命令的 FIELDS 和 LINES 子句的语法是同样的。两个子句都是可选的,可是若是两个同时被指定,FIELDS 子句必须出如今 LINES 子句以前。
若是用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl -> FIELDS TERMINATED BY ':' -> LINES TERMINATED BY '\r\n';
LOAD DATA 默认状况下是按照数据文件中列的顺序插入数据的,若是数据文件中的列与插入表中的列不一致,则须要指定列的顺序。
如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法以下:
mysql> LOAD DATA LOCAL INFILE 'dump.txt' -> INTO TABLE mytbl (b, c, a);
mysqlimport客户端提供了LOAD DATA INFILEQL语句的一个命令行接口。mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。
从文件 dump.txt 中将数据导入到 mytbl 数据表中, 能够使用如下命令:
$ mysqlimport -u root -p --local database_name dump.txt password *****
mysqlimport命令能够指定选项来设置指定格式,命令语句格式以下:
$ mysqlimport -u root -p --local --fields-terminated-by=":" \ --lines-terminated-by="\r\n" database_name dump.txt password *****
mysqlimport 语句中使用 --columns 选项来设置列的顺序:
$ mysqlimport -u root -p --local --columns=b,c,a \ database_name dump.txt password *****
http://www.runoob.com/mysql/mysql-database-import.html
6五、建立存储过程
执行存储过程
使用CALL子句执行存储过程,CALL子句接受存储过程的名称以及须要传递的参数。
CALL ordertotal(1,TRUE,@total);
SELECT @total;
若是存储过程当中定义了OUT类型的输入参数,那么在执行存储过程时须要传入变量,如这里@total,而且变量都是用@开始的。若是存储过程当中没有参数的话,就用空圆括号表示便可,CALL ordertotal();
删除存储过程
删除存储过程,能够使用DROP PROCEDURE子句。如DROP PROCEDURE ordertotal;
查询存储过程
一、显示建立一个存储过程的语句,能够使用SHOW CREATE PROCEDURE。如SHOW CREATE PROCEDURE ordertotal;
二、查询全部存储过程的状态,若是在定义存储过程当中使用COMMENT添加注释,能够查看。同时能够LIKE进行过滤结果。如SHOW PROCEDURE STATUS LIKE '%order%'
什么是事务?
事务处理是用来维护数据库的完整性,它保证成批的MySQL操做要么彻底执行,要么彻底不执行。事务处理是一种机制,用来管理必须成批执行的MySQL操做,它们要么时做为总体执行或者彻底不执行。
关键概念:
事务:是指一组SQL语句;
回退:是指撤销指定的SQL语句的过程;
提交:指将未存储的SQL语句的结果写入数据库表中;
保留点:指事务处理中设置的临时占位符,能够对它发布回退。
如何建立执行事务?
START TRANSACTION;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
SELECT * FROM customers;
SAVEPOINT insertinto;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
ROLLBACK TO insertinto;
执行结果为:插入数据('1',5,18)有效,由于,只会从保留点SAFEPOINT以后开始回退,也就是说保留点SAFEPOINT以前的SQL语句执行的结果仍然有效。
有这样一些细节:
START TRANSACTION用来表示下面的SQL语句集为一段事务;
SAFEPOINT 用于指定保留点insertinto;
ROLLBACK TO表示从指定保留点开始回退,也就是说保留点以前的SQL语句执行结果依然有效。若是仅仅使用ROLLBACK进行回退的话就表示从STAET TRANSACTION以后全部的SQL语句执行效果都会撤销。
MySQL提交(写或保存)操做是自动进行的,这称之为隐含提交。可是在事务处理块中,提交不会隐含进行,要使用COMMIT子句进行提交。如:
START TRANSACTION;
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('1',5,18);
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
COMMIT;
采用COMMIT提交事务,若是两条SQL语句都执行成功,才会将数据都写入表中。
6七、触发器
当某条SQL语句发生时,自动执行某些其余的SQL语句的时候就须要使用到触发器。触发器只能响应:DELETE、INSERT、UPDATE这三个特定操做。
MySQL建立触发器首先要建立触发器中待存储的表,而后再设定触发器被激活的时刻,最后在知足定义条件时触发,并执行触发器中定义的语句集合
如何建立触发器?建立触发器时须要给出最重要的四条信息:
全局惟一的触发器名;
触发器关联的表;
触发器在什么时候执行(操做执行以前或者以后);
触发器应该响应的活动(DELETE、INSERT或者UPDATE)。
建立触发器的语法以下:
1 2 3 |
|
因为触发器只能响应特定的三种类型的操做,所以可建立的触发器也就三种类型:INSERT触发器,DELETE触发器以及UPDATE触发器。
/*建立触发器*/
CREATE TRIGGER insertcustomers AFTER INSERT ON customers
FOR EACH ROW SELECT NEW.cust_id INTO @newinsertid;
/*执行触发器*/
INSERT INTO customers (cust_name,item_price,item_quantity) VALUES ('2',5,18);
SELECT @newinsertid;
INSERT | UPDATE | DELETE
表示触发事件,用于指定激活触发器的语句的种类
INSERT:将新行插入表时激活触发器
DELETE: 从表中删除某一行数据时激活触发器
UPDATE:更改表中某一行数据时激活触发器
注意 :
INSERT触发器
使用create trigger来建立触发器;
after insert代表在插入行数据以后,触发器才会执行特征操做;
for each row 表示对插入的每一行数据,触发器都起做用;
针对insert触发器,能够使用虚拟表new,来使用刚插入的行数据。好比例子中,select NEW.cust_id into @newinsertid表示将新插入的行数据的id赋值给变量@newinsertid。
DELETE触发器
DELETE触发器在DELETE语句执行以前或者以后,须要知道如下两点:
在DELETE触发器代码内,能够引用一个名为OLD的虚拟表,来访问被删除的行;
OLD表中的数据只能读,不能被更新,而在INSERT触发器中,就能够经过NEW来更新被插入的行数据。
例如,针对customers表,当删除一行数据时,返回被删除数据的cust_id以及cust_name:
/*建立DELETE触发器*/
DELIMITER //
CREATE TRIGGER insertcustomers AFTER DELETE ON customers
FOR EACH ROW
BEGIN
SELECT OLD.cust_name INTO @deletecustname;
SELECT OLD.cust_id INTO @deletecustid;
END //
/*调用DELETE触发器*/
DELETE FROM customers WHERE cust_id = 3;
SELECT @deletecustname;
SELECT @deletecustid;
基本上与建立INSERT触发器同样,只不过在DELETE触发器中只能使用OLD来访问被删除的行数据。
UPDATE触发器
UPDATE触发器在UPDATE语句执行以前或者以后执行,须要知道一下几点:
在BEFORE UPDATE触发器中能够使用NEW和OLD来访问数据,而在AFTER UPDATE触发器中使用NEW来访问数据会报错,只能使用OLD来访问数据;
在BEFORE UPDATE触发器中,NEW中的值能够被改变,即容许更改将用于UPDATE的数据;
OLD中的行数据只能读,不能被更新。
一个UPDATE触发器示例以下:
/*建立UPDATE触发器*/
DELIMITER //
CREATE TRIGGER insertcustomers BEFORE UPDATE ON customers
FOR EACH ROW
BEGIN
SELECT NEW.cust_name INTO @beforeupdate;
SET NEW.cust_name = 'reset_name';
SELECT OLD.cust_name INTO @afterupdate;
END //
/*调用UPDATE触发器*/
UPDATE customers SET cust_name = 'happy' WHERE cust_id = 5;
SELECT @beforeupdate;
SELECT @afterupdate;
输出为@beforeupdate为‘happay’,而@afterupdate为'reset_name'。有这样一些细节:
NEW虚拟表中的数据能够更改,如这里采用SET NEW.cust_name = 'reset_name';,将待更新的cust_name由“happy”变成了“reset_name”;
在BEFORE UPDATE触发器中能够使用NEW和OLD来访问数据,而在AFTER UPDATE触发器中使用NEW来访问数据会报错。
删除触发器?
删除触发器,能够使用 DROP TRIGGER语句,好比DROP TRIGGER insertcustomers。触发器不能更新或者覆盖,若是要修改触发器,必须删除这个触发器。
一、建立索引
在常常查询而不常常增删改操做的字段加索引。
order by与group by后应直接使用字段,并且字段应该是索引字段。
一个表上的索引不该该超过6个。
索引字段的长度固定,且长度较短。
索引字段重复不能过多,若是某个字段为主键,那么这个字段不用设为索引。
在过滤性高的字段上加索引。
二、使用索引注意事项
使用like关键字时,前置%会致使索引失效。
使用null值会被自动从索引中排除,索引通常不会创建在有空值的列上。
使用or关键字时,or左右字段若是存在一个没有索引,有索引字段也会失效。
使用!=操做符时,将放弃使用索引。由于范围不肯定,使用索引效率不高,会被引擎自动改成全表扫描。
不要在索引字段进行运算。
在使用复合索引时,最左前缀原则,查询时必须使用索引的第一个字段,不然索引失效;而且应尽可能让字段顺序与索引顺序一致。
避免隐式转换,定义的数据类型与传入的数据类型保持一致。
修改/etc/my.cnf如下位置
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
修改MYSQL默认类型为MYISAM
修改/etc/my.cnf文件,在[mysqld]下增长一句,同理可修改类型为INNODB 。
default-storage-engine=MYISAM
>show global variables like '%timeout' #查看数据库相关的时间。
在命令行环境下能够使用 mysqladmin 建立和删除数据库。
建立数据库:
shell> mysqladmin create db_name
删除数据库:
shell> mysqladmin drop db_name
若是出现下面的错误:
mysqladmin: connect to server at 'localhost' failed
error: 'Access denied for user: 'root@localhost' (Using password: YES)'
表示你须要一个能够正常链接的用户,请指定-u -p 选项,具体方法与 3.2 节介绍相同,在第七章中你将会学到用户受权的知识。
shell>mysqladmin -u root -p shutdown
Enter Password:***********
shell>mysqladmin -u root -p shutdown
Enter Password:***********
输入修改过的密码便可。
7一、开启慢查询日志
方法一 :
// 查询是否开启慢查询 ON OR OFF
show variables like 'log_slow_queries'
// 查询是否开启慢查询日志 ON OR OFF
show variables like 'show_query_log'
// 指定慢查询日志的存储位置 目录要具备写权限
set global show_query_log_file = '/home/mysql/sql_log/mysql-slow.log'
// 把没有使用索引的sql记录到慢查询日志中 若是table的数据量小,不建议开启该条设置,由于会记录全部没有用到索引的查询,会给日志填充不少垃圾信息
set global log_queries_not_using_indexes = on;
// 超过1秒钟查询记录到慢查询日志中
set global long_query_time = 1;
方法二 :
经过my.ini开启慢查询日志(原理和用命令同样),不过配置完成须要重启MySQL目录要具备写权限
log-slow-queries = '/home/mysql/sql_log/mysql-slow.log'
// 在windows的状况下须要绝对路径
log-slow-queries = 'C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-slow.log'
long_query_time = 1
log-queries-not-using-indexes = on
慢查询日志所包含的内容
// 执行SQL的主机信息:ROOT用户在本地所执行的查询
# User@Host: root['root'] @ localhost []
// SQL的执行信息 查询时间、锁定时间、发送行数、扫描行数
# Query_time:0.000024 Lock_time:0.0000000 Rows_sent:0 Rows_examined:0
// SQL执行时间 时间戳
# SET timestamp = 1402389328;
// SQL的内容
# select CONCAT('storage engine:',@@storage_engine) as INFO;
慢查询日志分析工具
工具1:mysqldumpslow(官方工具) 通常集成在MySQL安装包中
直接使用mysqldumpslow命令便可使用
工具2:pt-query-digest工具
输入命令系统提示没有的话能够查找安装一下
工具3:本身写脚本将日志中的语句列出来,经过网页的形式查看
7二、配置主从同步
#启动端口为3506的实例
[mysql@app ~]$ mysqld_safe --defaults-file=/data/inst3506/data3506/my3506.cnf &
[mysql@app ~]$ msyql -P3506
slave@localhost[(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3506 |
+---------------+-------+
#为从库添加指向主库的相关配置信息,该命令会生成及修改备库上的master.info及relay-log.info文件
slave@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='192.168.163.130',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl',
-> MASTER_PORT=3406,
-> MASTER_LOG_FILE='inst3406bin.000001',
-> MASTER_LOG_POS=0;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
#出现了2个warnings,查看一下
slave@localhost[(none)]> show warnings \G
*************************** 1. row ******
#此时查看从库的状态信息
Slave_IO_Running: No #IO线程没有运行
Slave_SQL_Running: No #SQL线程没有运行
能够看到从库上的2个线程,一个是用于I/O线程,用于链接到主库请求主库发送binlog,一个是用于执行SQL的SQL线程。
slave@localhost[(none)]> start slave; #启动slave
robin@localhost[(none)]> show slave status\G #再次查看slave的状态
slave@localhost[(none)]> show processlist\G #
1: 以下命令,在初次开启mysql服务后,会提示给用户:
#mysqladmin -u root password '123';
若是已经有密码存在,要修改的话:
#mysqladmin -u root -p password 'new_pwd';
以后输入旧密码回车便可
2. set password for 'root'@'主机名'=password('密码');
3.alter user'root'@'localhost' identified by '123';
4. grant all on*.* to 'username'@'localhost'identified by 'password';
注意:grant select on *.* to dba@localhost; dba能够查询 MySQL中全部数据库中的表。
grant all on*.* to dba@localhost; dba能够
管理 MySQL中的全部数据库。
1.执行以下命令设置MySQL数据库的远程访问。
mysql> grant all on *.* to 'root'@'%' identified by '111111';
mysql> flush privileges;
2.修改db.propertie文件的密码。
2.1修改 /mnt/datapool/msconf/db.propertie中的host的password,改为新password。
2.2修改当前相似云盘这类程序的配置db.properties文件修改密码,同上面1的操做差很少。
/Loongdisk/managerservice/db.properties的将host的password,改为新password。
建立一个能够从任何地方链接到服务器的一个超管帐户,必须分配一个密码 mysql> grant all privileges on *.* to 'user_name'@'localhost' identified by 'password' ; 格式:grant select on 数据库.* to 用户名@登陆主机 identified by “密码” 删除受权: mysql> revoke all privileges on *.* from root@”%”; mysql> delete from user where user=”root” and host=”%”; mysql> flush privileges; 重命名表: mysql > alter table t1 rename t2; 备份: mysqldump -hhostname -uusername -ppassword databasename > backup.sql; 恢复: mysql -hhostname -uusername -ppassword databasename< backup.sql;
一、增
insert into 表 (列名,列名...) values (值,值,...)
insert into 表 (列名,列名...) values (值,值,...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表
例:
insert into tab1(name,email) values('zhangyanlin','zhangyanlin8851@163.com')
二、删
delete from 表 # 删除表里所有数据
delete from 表 where id=1 and name='zhangyanlin' # 删除ID =1 和name='zhangyanlin' 那一行数据
三、改
update 表 set name = 'zhangyanlin' where id>1
四、查
select * from 表
select * from 表 where id > 1
select nid,name,gender as gg from 表 where id > 1
条件判断where
通配符like
限制limit
排序asc,desc
分组group by
7八、修改表
添加列: alter table 表名 add 列名 类型 删除列: alter table 表名 drop column 列名 修改列: alter table 表名 modify column 列名 类型; -- 类型 alter table 表名 change 原列名 新列名 类型; -- 列名,类型 添加主键: alter table 表名 add primary key(列名); 删除主键: alter table 表名 drop primary key; alter table 表名 modify 列名 int, drop primary key; 添加外键: alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段); 删除外键: alter table 表名 drop foreign key 外键名称 修改默认值: ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000; 删除默认值: ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
对于上述这些操做是否是看起来很麻烦,很浪费时间,别慌!有专门的软件能提供这些功能,操做起来很是简单,这个软件名字叫Navicat Premium ,你们自行在网上下载,练练手,可是下面的即将讲到表内容操做仍是建议本身写命令来进行
性能,结构和数据分析工具
Anemometer – 一个 SQL 慢查询监控器。
innodb-ruby – 一个对 InooDB 格式文件的解析器,用于 Ruby 语言。
innotop – 一个具有多种特性和可扩展性的 MySQL 版 ‘top’ 工具。
pstop – 一个针对 MySQL 的类 top 程序,用于收集,汇总以及展现来自 performance_schema 的信息。
mysql-statsd – 一个收集 MySQL 信息的 Python 守护进程,并经过 StatsD 发送到 Graphite。
备份/存储/恢复 工具
MyDumper – 逻辑的,并行的 MySQL 备份/转储工具。
MySQLDumper – 基于 web 的开源备份工具-对于共享虚拟主机很是有用。
mysqldump-secure – 将加密,压缩,日志,黑名单和 Nagios 监控一体化的 mysqldump 安全脚本。
Percona Xtrabackup – 针对 MySQL 的一个开源热备份实用程序——在服务器的备份期间不会锁定你的数据库。
给你的服务器进行压测的工具
iibench-mysql -基于 Java 的 MySQL/Percona/MariaDB 索引进行插入性能测试工具。
Sysbench – 一个模块化,跨平台以及多线程的性能测试工具。
7九、慢查询日志
有时候若是线上请求超时,应该去关注下慢查询日志,慢查询的分析很简单,先找到慢查询日志文件的位置,而后利用mysqldumpslow去分析。查询慢查询日志信息能够直接经过执行sql命令查看相关变量,经常使用的sql以下:
-- 查看慢查询配置
-- slow_query_log 慢查询日志是否开启
-- slow_query_log_file 的值是记录的慢查询日志到文件中
-- long_query_time 指定了慢查询的阈值
-- log_queries_not_using_indexes 是否记录全部没有利用索引的查询
SHOW VARIABLES LIKE '%quer%';
-- 查看慢查询是日志仍是表的形式
SHOW VARIABLES LIKE 'log_output'
-- 查看慢查询的数量
SHOW GLOBAL STATUS LIKE 'slow_queries';
mysqldumpslow的工具十分简单,我主要用到的是参数以下:
-t:限制输出的行数,我通常取前十条就够了
-s:根据什么来排序默认是平均查询时间at,我还常常用到c查询次数,由于查询次数很频繁可是时间不高也是有必要优化的,还有t查询时间,查看那个语句特别卡。
-v:输出详细信息
例子:mysqldumpslow -v -s t -t 10 mysql_slow.log.2018-11-20-0500
80、
常见问题 :
一、delete,drop,truncate 都有删除表的做用,区别在于:
二、like 匹配/模糊匹配,会与 % 和 _ 结合使用。
'%a' //以a结尾的数据 'a%' //以a开头的数据 '%a%' //含有a的数据 '_a_' //三位且中间字母是a的 '_a' //两位且结尾字母是a的 'a_' //两位且开头字母是a的
查询以 java 字段开头的信息。
SELECT * FROM position WHERE name LIKE 'java%';
查询包含 java 字段的信息。
SELECT * FROM position WHERE name LIKE '%java%';
查询以 java 字段结尾的信息。
SELECT * FROM position WHERE name LIKE '%java';
三、UNION 语句:用于将不一样表中相同列中查询的数据展现出来;(不包括重复数据)
UNION ALL 语句:用于将不一样表中相同列中查询的数据展现出来;(包括重复数据)
使用形式以下:
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称; SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;
四、group by 能够实现一个最简单的去重查询,假设想看下有哪些员工,除了用 distinct,还能够用:
SELECT name FROM employee_tbl GROUP BY name;
返回的结果集就是全部员工的名字。
分组后的条件使用 HAVING 来限定,WHERE 是对原始数据进行条件限制。几个关键字的使用顺序为 where 、group by 、having、order by ,例如:
SELECT name ,sum(*) FROM employee_tbl WHERE id<>1 GROUP BY name HAVING sum(*)>5 ORDER BY sum(*) DESC;
五、直接切还到某一个数据库 :mysql -u -pxxxxxxx -D db1(数据库) -o
六、MYSQL返回值的意思 ?
容许NULL值,则说明在插入行数据时容许不给出该列的值,而NOT NULL则表示在插入或者更新该列数据,必须明确给出该列的值;
DEFAULT表示该列的默认值,在插入行数据时,若没有给出该列的值就会使用其指定的默认值;
PRIMARY KEY用于指定主键,主键能够指定一列数据,而能够由多列数据组合构成,如PRIMARY KEY(cust_id,cust_name);
ENGINE用于指定引擎类型。常见的引擎类型有这些:
(1)InnoDB是一个支持可靠的事务处理的引擎,可是不支持全文本搜索;
(2)MyISAM是一个性能极高的引擎,它支持全文本搜索,可是不支持事务处理;
(3)MEMORY在功能上等同于MyISAM,但因为数据存储在内存中,速度很快(特别适合于临时表);
在建立表的时候能够使用FOREIGN KEY来建立外键,即一个表中的指FOREIGN KEY向另外一个表中PRIMARY KEY。外键FOREIGN KEY用于约束破坏表的联结动做,保证两个表的数据完整性。同时也能防止非法数据插入外键列,由于该列值必须指向另外一个表的主键。
一、FROM:对FROM左边的表和右边的表计算笛卡尔积,产生虚表VT1;
二、ON:对虚拟表VT1进行ON筛选,只有那些符合<join_condition>条件的行才会被记录在虚拟表VT2中;
三、JOIN:若是是OUT JOIN,那么将保留表中(如左表或者右表)未匹配的行做为外部行添加到虚拟表VT2中,从而产生虚拟表VT3;
四、WHERE:对虚拟表VT3进行WHERE条件过滤,只有符合<where_condition>的记录才会被放入到虚拟表VT4;
五、GROUP BY:根据GROUP BY子句中的列,对虚拟表VT4进行分组操做,产生虚拟表VT5;
六、CUBE|ROLLUP:对虚拟表VT5进行CUBE或者ROLLUP操做,产生虚拟表VT6;
七、HAVING:对虚拟表VT6进行HAVING条件过滤,只有符合<having_condition>的记录才会被插入到虚拟表VT7中;
八、SELECT:执行SELECT操做,选择指定的列,插入到虚拟表VT8中;
九、DISTINCT:对虚拟表VT8中的记录进行去重,产生虚拟表VT9;
十、ORDER BY:将虚拟表VT9中的记录按照<order_by_list>进行排序操做,产生虚拟表VT10;
十一、LIMIT:取出指定行的记录,产生虚拟表VT11,并将结果返回。
十二、IN类型,表示传递给存储过程;
1三、OUT类型,表示存储过程返回的结果,在调用存储过程时须要传入@开始的变量;
1四、INOUT类型,表示在存储过程当中能够传入和传出;
1五、DECLARE用来声明一个变量,如这里的total,taxrate。注意MySQL中定义变量时都是变量名在前,数据类型在后。
1六、存储过程具体逻辑写在BEGIN END之间;
1七、将值赋给变量使用INTO关键字;
七、删除表数据
一、若是从表中删除数据的话,能够使用DELETE子句。DELETE FROM customers WHERE cust_id = 10086;删除的数据一定是表中行数据,而不是某一列。所以,与UPDATE子句相比,DELETE子句并不须要指定是哪一列,而仅仅只须要指定具体的表名便可;
二、注意:若是不添加WHERE指定条件的话,会将整个表中全部行数据所有删除。另外,DELETE只是删除表中的数据,而不会删除表结构信息;
三、若是想删除表中所有的数据,能够使用TRUNCATE,比DELETE删除效率更高。
八、建立数据库 索引 的方法 :
MySQL索引的创建对于MySQL的高效运行是很重要的,索引能够大大提升MySQL的检索速度。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,而组合索引,即一个索引包含多个列。
建立索引
建立索引有两种方式,一种是直接利用create index进行建立,另一种则是经过修改表结构来进行添加,则是利用ALTER TABLE语句。
[UNIQUE|FULLTEXT|SPATIAL] 其中括号中的这三个关键字表示建立的索引类型,它们分别表示惟一索引、全文索引、空间索引三种不一样的索引类型。若是咱们不指定任何关键字,则默认为普通索引。
注意 : 在MySQL中,有两种不一样形式的索引——BTREE索引和HASH索引。在存储引擎为MyISAM和InnoDB的表中只能使用BTREE,其默认值就是BTREE;在存储引擎为MEMORY或者HEAP的表中能够使用HASH和BTREE两种类型的索引,其默认值为HASH。
九、一个版本为12.1.0.2的Oracle数据库,每到晚上总会不定时地主机CPU持续到100%,应用同时会建立大量的数据到数据库中。当时应急方案是把这种相关的等待时间所有批量Kill掉,由于这些系统是在比较核心的库里,基本上每一个系统被Kill掉的进程有几千个。
着手重点分析问题,经过ASH分析发现,出现这个异常等待是由于一个很简单的语句——SELECT USER FROM SYS.DUAL。
以后就经过这个语句来一步步关联, 看究竟是哪一个地方调用的,结果发现是在一个应用用户的登陆TRIGGER中的用户判断步骤。这个USER是Oracle的内部函数,但就是这么简单的一个语句,就让整个库都Hang住了。
经过ASH发现该语句在咱们恢复应用前有从新加载的过程。当时怀疑是硬件致使的,就经过这种方式去分析,结果发现是在晚上10点时被Oracle的自动任务作了一个统计信息的自动收集,收集完后,又由于它是一个登陆的Trigger,用户在不断登陆,在作登陆解析时这个语句就没办法解析,因此才致使用户源源不断地卡在那里。而应用是须要新建链接的,新建的链接又没法进到库里面,就会致使链接数愈来愈多,全都卡在那里。最后经过锁定dual表统
计信息的收集来从根本上解决这个问题。
十、一个数据库是从10.2.0.5.X升级到10.2.0.5.18版本,升级后会不定时出现cursor:pin相关的一些等待。其实出现cursor:pin是很正常的,由于这个数据库的负载比较高,变化也较高,但问题是它是在升级以后出现的。运营认为这是升级以后出现的异常,咱们就开始着手分析问题的缘由。
第二个问题是在应急时发现的,有时异常出现时,某个库里有些语句的执行次数会特别高,甚至15min能达到上亿次,这对于一个正常的业务系统来讲,出现这么高的执行频率是不正常的。
以后就去分析这些问题,发现这两个问题有相同的一些点,好比语句中间出现了个函数调用;好比说这个状况下,A表若是访问的数据量较大时,这些函数就有可能被调用不少次。
有一个语句,它执行一次可能会出现十几万次的函数调用。若是在调用的过程当中,关联的那张表的执行计划发生了变化,好比说A表走了一个全程扫描,那可能会出现几千万次的函数调用。
总结了一些关于经过什么样的方法去快速定位、是不是函数调用致使的见解。在10g以前确实没有什么好的办法,由于它里面没有一个显示的关联,就可能经过代码去扫描,去找对应的语句。在11g后会比较简单一些,经过AS值相关的TOP LEVEL SQL ID就能够直接关联到是哪一个语句调的函数致使的问题。
这里还有一个问题是函数调用。由于它调用的函数可能都是特别快的,但次数有会比较高,性能波动可能带来比较大的影响。以前咱们有一个案例就发生在月底高峰,咱们当时发现某个数据库中会出现不少CBC的等待,后来又发现有一个小表被频繁访问,那个小表就100多行数据,但可能它相关的语句每隔15min就调用了上千万次。
其实这么高的并发下,出现这种CBC的等待是很正常的。不过由于它只有100多行数据,且都集中在一个数据块里,因此才致使这个数据块特别热,就会一直出现这种CBC的等待。
方案:建一个PCT FREE 99的索引,把表全部列的数据都包含进去,确保每一个索引块里面只保留了一行数据,变相地把这100多行数据分到100多个块里。
作了这个操做后,CBC相关的问题被解决了,也顺利地撑过了业务高峰期,但次日月初的报表发现又掉坑里了。
对于大表的分表改造就是先同步历史数据级改造,后作一个数据增量。
十一、数据库CPU使用率频频100%又没有明显TOPSQL?
此次故障处理的过程反思能够发现,其实很多的隐患,在平常的巡检,SQL审核中均可以被发现,但到了故障现场,可能因为环境的复杂,被放大后出不少衍生故障,分析定位起来则麻烦很多。平常的巡检,SQL审核多花些精力,按期更新本身的知识库,这些时间最终都是高回报的。
一、100% HIGH CPU风险
100% CPU使用率的风险是大部分系统都存在的,最难受的是发生了HIGH CPU后,可能主机SSH都没法访问。这种风险建议在CPU_COUNT层面作调整,该参数默认值是使用所有的CPU资源,考虑对其进行调整为逻辑CPU-2(单机数据库)。
RAC架构下同一集群有多个数据库的结合具体状况考虑实例CPU隔离,参考support文档(1362445.1)。
resource manager在处理总体使用率上不太好用,业务上AP、TP混合的话,能够经过RM调整业务的优先级,保障重点业务。报表拖垮了交易系统的问题,能够经过RM来实施保障。
二、LGWR日志同步性能隐患
高CPU使用率(通常超过80%)或CPU个数过多状况下,LGWR性能可能受CPU调度影响较大,建议`_high_priority_processes` 设置LGWR。该参数调整须要重启数据库,建议规划后集中调整。
十二、没法将该字符添加到数据库中:
ERROR 1366: Incorrect string value: '\xF0\x9D\x8C\x86' for column 'text' at row 1
SQL语句:
INSERT INTO `test`.`new_table` (`ID`, `text`) VALUES ('1', '𝌆');
我试着运行这个命令
use test; ALTER TABLE new_table CHANGE text text VARCHAR(191) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
输出显示“0行受影响”。
0 row(s) affected Records: 0 Duplicates: 0 Warnings: 0
我猜utf8mb4
不适用于个人行。
但当我运行如下命令时:
ALTER DATABASE test CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 1 row(s) affected
还会发生什么?
最新状况:找到了!我失踪了:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
1三、删除安装的全部的 mysql相关软件包
find / -name "mysql*" -exec rm -rf {} \;
1四、yum没法安装MySQL数据库,
解决办法 :
一、ping baidu.com查看网络状况,没法上网,先检测DNS配置
cat /etc/resolv.conf,发现有DNS,
再添加一个DNS地址,8.8.8.8,仍是没法上网。
/etc/init.d/network restart #重启网卡
再查看DNS配置文件,#cat/etc/resolv.conf ,查看IP信息, #ifconfig,查看有没有设置的DNS
二、仍是没有ping通,#cat /etc/sysconfig/network-scripts/ifcfg-eth0查看网关有没有配置。使用route -n再次查看网关设置超过,
#sestaus 查看防火墙状态
/etc/init.d/iptables stop
没有网关,添加一个,0.0.0.0表示外网的任意地址 ,应射到到网关地址192.168.149.2,从dev eth0出去。
1五、如何清空MySQL日志
#cat /dev/null > /var/log/mariadb/mariadb.log
mysql5.5启动命令
#/usr/local/mysql55/bin/mysql_safe --user=mysql
查看日志
#tailn -nf 100 /var/log/mariadb/mariadb.log
#cat /var/log/mariadb/mariadb.log
常见问题 :
查看有没有这目录
ll /var/run/mariadb/
建立目录
mysql5.5启动命令
#/usr/local/mysql55/bin/mysql_safe --user=mysql
1六、MySQL读写分离
1)为何保证MySQL主、从数据一致?
2)用户访问WEB网站,注册了用户名和密码,xiaowagn,123456;
3)用户注册成功以后,WEB将数据信息写入主库,此时从库若是没有同步主库用户和密码信息;
4)使用xiaowang用户和密码登陆,WEB读取MYSQL读库,WEB会返回无此用户,提示从新注册;
5)MYSQL主备数据就要严格保持一致,避免发生上面的状况。
1七、MYSQL主从
1八、
1九、
20、
2一、
2二、
参考链接:CPU使用率频频100%又没有明显TOPSQL?换个思路突破 :https://mp.weixin.qq.com/s/XaSvbsaYy9lGqgr37ysynA
连接 :
新手MySQL工程师必备命令速查手册 : https://mp.weixin.qq.com/s/87BoE2-0mW_3qALyNSpiTw
MySQL监控工具 Percona监控工具初探 : https://www.centos.bz/2018/01/percona%E7%9B%91%E6%8E%A7%E5%B7%A5%E5%85%B7%E5%88%9D%E6%8E%A2/
https://www.cnblogs.com/shenqz/p/6962493.html
MariaDB 10.3首推系统版本表,误删数据不用跑路了! : https://mp.weixin.qq.com/s/NJip_E3iVFVnp0golFz1Ig
企业面试题|最常问的MySQL面试题集合(一 ):https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486211&idx=1&sn=c8bbf47e3dd892443142ba9b33c37321&chksm=e91b6e1fde6ce7095709efd81614c72fcde19b00524e680a65458b25a181c73b227daa150506&scene=21#wechat_redirect
企业面试题|最常问的MySQL面试题集合(二) : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486284&idx=1&sn=5f8ed7d5985d7feb202bdcbd3343125c&chksm=e91b6e50de6ce746831e2744188a30d99d6729be7f1344ef4c5b6add4a2b456c1acf8f4a5f58&scene=21#wechat_redirect
参考连接 :
mysql数据库基础命令(一) : https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247484584&idx=1&sn=3bf48189c571bacc1859ef72922ff6eb&chksm=e91b61b4de6ce8a2e2fb2908c8d401e01159780b4786224abbdccb6889f00bd77bfc45ec3f06&scene=21#wechat_redirect
MySQL 基础操做: https://www.processon.com/special/template/5b2f5f7de4b01a7cb45db105#map
www.runoob.com : http://www.runoob.com/mysql/mysql-database-info.html
数据库怎么分库分表,垂直?水平? :https://mp.weixin.qq.com/s/MMau4yMwxPTFnVEKpDHYpg
企业中MySQL主流高可用架构实战三部曲之MHA :https://blog.51cto.com/sumongodb/1951495
mysql怎么建立触发器 :https://mp.weixin.qq.com/s/LouhSOdCTxSKRhHNuw701Q
怎样在 Ubuntu Linux 上安装 MySQL | Linux 中国 : https://mp.weixin.qq.com/s/NqrCwc9qcUbslAWdwqWyuw
MySQL用户和权限管理 :https://mp.weixin.qq.com/s/rqLLPw8_yHPudT-Kgtjc4A
MySQL数据库之链接查询 : https://mp.weixin.qq.com/s/oEec6yyabulQ9pDwMA8PQg
推荐一款支持 SQL/NoSQL 数据库的通用命令行工具 USQL : https://mp.weixin.qq.com/s/NmOqYtxS1taYmvGPstVrKw
MySQL 超级入门教程(内含资源福利) :https://mp.weixin.qq.com/s/2BT5JqCA_WV5OnlRC6-h-A
MySQL精选 | 枚举类型ENUM的DDL变动测试 :https://mp.weixin.qq.com/s/xpVmB07JgSRE2Nat3lbtoA
MySQL史上最全性能优化方式 : https://mp.weixin.qq.com/s/FqiGwfNWWposdqAC0zFofw
技术核心 | MySQL性能结构优化原理 : https://mp.weixin.qq.com/s/qrK8EdlZMfeReSAKpGnfJA
MySQL DBA基本知识点梳理和查询优化 :https://mp.weixin.qq.com/s/CdF4iCK72WUOl8c5wny0-Q
MySQL DBA必备工具使用的6大锦囊妙计 :https://blog.51cto.com/sumongodb/1955184
企业主流MySQL高可用集群架构三部曲之PXC : https://blog.51cto.com/sumongodb/1956086
MySQL主从延迟解决方案 荐 :https://blog.51cto.com/sumongodb/1958723
利用binlog2sql快速闪回误删除数据 - 别拿豆包不当干粮 荐 : https://blog.51cto.com/sumongodb/2046073
MySQL数据库之链接查询 : https://mp.weixin.qq.com/s/oEec6yyabulQ9pDwMA8PQg
支撑百万并发的数据库架构如何设计? : https://mp.weixin.qq.com/s?__biz=MzUyNDkzNzczNQ==&mid=2247485858&idx=1&sn=823bdb7634e90c6775545930142d3582&chksm=fa24f6cacd537fdc01fcf8fc35374f113291a8f583bde4f482439b6764d55ab6c4f2bc71936b&scene=21#wechat_redirect
基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构 :http://imysql.com/tag/mysql%e9%ab%98%e5%8f%af%e7%94%a8
MySQL 备份和恢复 : http://imysql.cn/mysql_backup_and_recover
为何你的SQL执行很慢 : https://www.jianshu.com/p/96c5afdb84c6
找到MySQL服务器发生SWAP罪魁祸首 : http://imysql.com/2016/11/30/mysql-faq-find-who-cause-mysql-swap.shtml
一次很是有意思的SQL优化经历:从30248.271s到0.001s :https://www.jianshu.com/p/9fab9266be84
巧用这19条MySQL优化,效率至少提升3倍 :https://mp.weixin.qq.com/s?__biz=MzUyNDkzNzczNQ==&mid=2247485791&idx=1&sn=b9f4097226c9d4ea13e0f1855bbe8b7b&chksm=fa24f637cd537f211ddec965f3b0ed3e3ebc0b03623dfec3f0b917298ea332d6c4968c407902&scene=21#wechat_redirect
[MySQL优化案例]系列 — RAND()优化 :http://imysql.com/2014/07/04/mysql-optimization-case-rand-optimize.shtml
[MySQL FAQ]系列 — 线上环境到底要不要开启query cache : http://imysql.com/2014/09/05/mysql-faq-why-close-query-cache.shtml
[MySQL FAQ]系列 — 为何InnoDB表要建议用自增列作主键 : http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml
优化案例 | 分区表场景下的SQL优化 : http://imysql.com/2017/04/11/mysql-optimize-with-many-partitions.shtml
优化系列 | DELETE子查询改写优化 : http://imysql.com/2016/06/29/mysql-optimization-rewrite-delete-subquery-to-join.shtml
重装上阵 | 最方即可靠的MySQL my.cnf生成工具 :http://imysql.com/2017/03/06/new-my-cnf-generator-reload.shtml
比较全面的MySQL优化参考(下篇) : http://imysql.com/2015/05/29/mysql-optimization-reference-2.shtml
tcpcopy,模拟在线MySQL压力测试的好帮手
MySQL 备份和恢复思路:http://imysql.cn/mysql_backup_and_recover
[MySQL FAQ]系列 — 为何要关闭query cache,如何关闭 :http://imysql.com/2015/03/27/mysql-faq-why-should-we-disable-query-cache.shtml
[MySQL优化案例]系列 — slave延迟很大优化方法 :http://imysql.com/2015/04/12/mysql-optimization-case-howto-resolve-slave-delay.shtml
优化系列 | 实例解析MySQL性能瓶颈排查定位 : http://imysql.com/tag/%e4%bc%98%e5%8c%96
发现一个关于MySQL的metadata lock的BUG :
https://mp.weixin.qq.com/s/Ia6DaXd4DHrXZ2ZMCzt0_A
MySQL 到 GBase 8t 迁移指南 | 周末送资料 : https://mp.weixin.qq.com/s/CM9dw_R87ditZ2P-IJ2xWg