mysql的主要目录结构:
/var/lib/mysql/ 数据库文件夹
/usr/share/mysql mysql.server命令和配置文件
/usr/bin mysqladmin,mysqldump等等命令
/etc/rc.d/init.d/ 启动脚本目录
mysql的安装
1.编译安装:
假设安装包位置在/home下
#tar -zxvf mysql-xxxxx
#./confinguer
#make && install
#useradd -g mysql mysql 添加一个账号mysql和组mysql
#cd xxxx/mysql
#scripts/mysql_install_db --user=mysql 初始化数据库。
#chown -R root . 更改xxx/mysql/下的权限
#chown -R mysql date 更改xxx/mysql/下的权限
#chgrp -R mysql . 更改xxx/mysql/下的权限
2.#yum install mysql-xxxx
3.#rpm -ivh mysql-xxxx --nodeps --nodeps 表示忽略依赖关系
安装完成后使用
#netstat -altn 查看3306端口开放说明安装成功。
修改登陆密码:
默认mysql是没有密码的。
#/usr/bin/mysqladmin -u USERNAME -p OLDPASSWD password NEWPASSWD
启动和停止:
#/etc/init.d/mysql start 启动
#/etc/init.d/mysql restart 重新启动
#/usr/bin/mysqladmin -u root -p shutdown 停止。
或者用:
#mysqladmin -u USERNAME -p PASSWORD start|shutdown|restart
实现自动启动:
#/sbin/chkconfig --list 察看mysql是否在自动启动列表中
#/sbin/chkconfig --add mysql 把MySQL添加到你系统的启动服务组里面去
#/sbin/chkconfig --del mysql 把MySQL从启动服务组里面删除
登陆退出mysql
#mysql -u USERNAME -p PASSWORD
#/mysql/bin/mysqld_safe --user=mysql 以后台方式用mysql的账号启动。
mysql>quit 退出mysql
mysql的配置:
#cp /usr/share/mysql/my-medium.cnf /etc/my.cnf 修改my.cnf文件来修改mysql的全局设置。
#vim /etc/my.cnf
innodb_flush_log_at_trx_commit=0 将my.cnf文件中的innodb_flush_log_at_trx_commit设成0来优化。
[mysqld]
lower_case_table_names=1 [mysqld]后添加添加lower_case_table_names设成1来不区分表名的大小写。
更改mysql数据库储存位置:
默认是储存在/var/lib/mysql下的。
假如要把目录移到/home/data。
#mkdir /home/date
#mysqladmin -u USERNAME -p PASSWORD shutdown
#mv /var/lib/mysql /home/data/
#vim /etc/my.cnf
socket =/home/data/mysql/mysql.sock
#vim /etc/rc.d/initd/mysql
datadir=/home/data/mysql
#mysqladmin restart
设置字符集
MySQL的默认编码是Latin1,不支持中文,要支持需要把数据库的默认编码修改为gbk或者utf8。
1.#bin/mysqladmin -u root shutdown 中止MySQL服务
2.#vim /etc/my.cnf 修改配置文件
[client]
default-character-set=utf8 默认编码是utf-8
[mysqld]
default-character-set=utf8
3.#……/bin/mysqld_safe 重新启动mysql。
查询字符集:show variables like '%set%';
增加MySQL用户
#grant [select|insert|update|delete|all privileges] on DB_NAME.* to USERNAME@HOSTNAME identified by "PASSWORD"
本机的话HOSTNAME填成localhost,'%'是任意主机。
例如:
grant select,insert,update,delete on *.* to user_1@'%' identified by '123';
grant all on *.* to user_1@'localhost' Identified by '123';
远程访问:
1.#grant all privileges on *.* to USERNAME@HOSTNAME identified by 'PASSWORD'。
例如:
#grant all privileges on *.* to xoops_root@'%' identified by '654321'
允许xoops_root用户可以从任意机器上登入MySQL。
2.编辑 /etc/mysql/my.cnf
#vim /etc/mysql/my.cnf
# skip-networking 注释掉此处。
#grant all on *.* to 'root'@'ip' identified by 'password'
使用root密码是password访问mysql
备份与恢复
1.备份:
#cd /val/lib/mysql
#mysqldump -u root -p --opt aaa > back_aaa
2.恢复:
#mysql -u root -p ccc < back_aaa
用户变量:
/USERNAME/.bash_profile 储存着用户变量。
#vim .bash_profile
PATH= :::/home/mysql/bin/ 添加mysql的路径。
#env 查看当前环境变量。
/etc/.bash_profile 系统环境变量。
常用的命令:
都是以;结尾。
mysql>show database; 显示数据库。
mysql>use DB_NAME; 进入名为DB_NAME的数据库。
mysql>show tables; 显示当前数据库中表
mysql>decrisb TAB_NAME;显示TAB_NAME这张表的结构。
mysql>select * from TAB_NAME; 查看名为TAB_NAME表中的信息。
mysql>create database DB_NAME; 新建一个名为DB_NAME的数据库。
mysql>create table TAB_NAME(VALUE1,VALUE2,VALUE3 primary key,……); 新建一个名为TAB_NAME的表,内容有VALEUE1等等,并且VALUE3为主键(primary key)。
mysql>insert into TAB_NAME values('VALUE1
','VALUE2'',……) 插入数据。
mysql>update TAB_NAME set VALUE1='VALUES' where VALUE2='VALUES' 将VALUE2所在行的VALUE1的值进行修改。
mysql>delete from TAB_NAME where VAULE1='VALUES' 将TAB_NAME中VALUE1所在的记录条目删除。
mysql>drop database DB_NAME 删除名为DB_NAME的数据库。
mysql>drop table TAB_NAME 删除名为TAB_NAME的表。
mysql的基本配置:
环境变量的设置:
计算机右键-->属性-->系统高级设置-->编辑环境变量,在PATH添加mysql的安装路径,并用;分隔开。
例如mysql的安装路径为:c:\program files\mysql\bin,则在PATH中将此路径添加。
mysql的启动关闭:
cmd下:
net start|stop MYSQLNAME
services.msc,打开服务管理器
找到名称为MYSQLNAME的服务进行启动和关闭以及其他操作。
连接mysql服务器
mysql的端口默认是3306。默认用户是root
mysql -h HOSTNAME -u USERNAME -p PASSWORD
本机连接时,主机名使用localhost。
例如:
mysql -h localhost -u root -p toor
mysql -h 192.168.1.100 -u root -p toor
查看mysql的基本信息:
mysqlshow DBNAME ;查看DBNAME的基本信息
mysql>show databases ;查看所有数据库
mysql>use DBNAME ; 使用DBNAME的数据库
mysql>show tables; 查看表
mysql>show warnings 查看警告信息
mysql>desc DBNAME 查看表的结构
mysql>select version(); 查看版本
mysql>select current_date; 查看日期
mysql>select now(); 查看时间
mysql>select user(); 查看用户
mysql>select database(); 查看当前数据库
mysql>show status 查看运行状态
mysql>show dngines\G; 查看当前所使用的存储引擎。
mysql>show variables like ‘%storage%’; 查看存储引擎。
mysql>show grants for ‘USERNAME@HOSTNAME’; 查看某个用户的权限
mysql的目录结构;
bin 客户端程序和mysql的服务器程序等等
%PROGRAMDATA%\MySQL\MySQL Server VERSION\ 日志文件,数据库
include 头文件
lib 库文件
share 错误信息 ,字符集设置文件,安装脚本,例子数据库等等
data 数据文件
doc 文档
notifier工具
mysql工具
mysql
命令行工具
使用前需要配置mysql,否则远程访问默认是关闭的。
mysql -h localhost -u root -p toor
mysql>use mysql
mysql>desc user
mysql>select host,user,password from user
mysql>update user set host =’% ’ where host=’localhost’
mysql>flush priviages
navicat
轻量级
mysql-front
轻量级
phpmyadmin
下载xampp,打开xampp的控制台xampp-control.exe,启动apache,并进行配置。
然后将phpmyadmin目录内的内容全部复制到\xampp\htdosc内。编辑config.inc.php,在其中添加mysql服务器的地址。
同时启动php的高级服务,取消注释。
然后重新启动apache,点击配置。
mysql workbench
mysql官方工具
mysql的存储引擎
存储引擎
mysql的核心组件,用来处理查询语句,InnoDB是最常用的存储引擎。在创建表的时候,使用 ENGINE=ENGTYPE 可以指定要用的引擎。
1.InnoDB
在\mysql\my.ini中有innodb_file_per_table选项,如果此选项为1,则为启用状态,每一个表和索引都将生成一个独立的文件。0为关闭,表和索引将储存在系统表空间内。默认情况下是启用的。
DBNAME.frm 表格式
DBNAME.ibd 数据
2.MyISAM
在web,数据仓储中常用,拥有较高的插入,查询速度,但不支持事务。
DBNAME.frm 表格式
DBNAME.MYD 数组
DBNAME.MYI 索引
3.MEMORY
创建一个特殊属性的表存储在内存中,数据安全性不高,访问快速,延迟低,用于临时操作和只读操作。
4.CSV
使用文本文件类型储存数据。数据使用逗号隔开,数据内容必须是NOT NULL属性的。
DBNAME.frm 表格式
DBNAME.CSM
DBNAME.CSV 数据
5.ARCHIVE
储存数据量大,数据本身非常小的表格。只支持INSERT和SELECT,不支持DELETE和REPLACE,UPDSTE,同时支持ORDER BY,BLOB。
DBNAME.frm 表格式
DBNAME.ARZ 数据
6.MERGE
DBNAME.frm 表格式
DBNAME.MRG 数据
设置存储引擎:
CREATE TABLE TABNAME (VAR1,VAR2,……) ENGINE=ENGTYPPE;
默认情况下是使用InnoDB。
1.当server启动时,使用--default-storage-engine参数。
2.编辑配置文件my.ini(Linux中是my.cnf),找到其中的default-storage-engine选项。
3.使用SET default_storage_engine=ENGTYPE:,在当前的的session中设定。
数据类型和计算符:
数值类型:
整数:
tinyint 1字节
smallint 2字节
mediumint 3字节
int(integer) 4字节
bigint 8字节
小数:
float 4字节
double 8字节
decimal
所有的小数都可以用(M,N)M表示精度,N表示小数的位数。
例如:
create table test
{
id int(11), #指定显示宽度,并不是长度。
name varchar(20),
salary float
}
日期/时间类型:
类型名称 | 日期格式 | 储存字节 |
YEAR | YYYY | 1字节 |
TIME | HH:MM:SS | 3字节 |
DATE | YYYY-MM-DD | 3字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 4字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 8字节 |
字符串类型:
char varchar binary varbinary blob txit enum set
char是固定长度字符,varchar是可变长度字符。char会自动删除插入数据的尾部空格,而varchar不会。
例如:
运算符:
算数运算符:
+ ,-,*,/, %
比较运算符:
> ,<, =, >=, <=, !=,<>
逻辑运算符:
与 and &,或or ||,非not !
位运算符;
位与 &,位或|,位异或^,左移<<,右移>>
is null 判断是否为空
is not null 判断是否为不空
isnull()函数
常用函数:
系统信息函数:
账号命名规则:
USERNAME@HOSTNAME/NETMASK
USERNAME@% %代表任意主机。
有特殊字符的用户名和主机要用‘’,单引号引起来。
账号用户名和主机名是储存在mysql数据库当中的user表中。如果账号名为空,则表示匹配任意账号。空白用户名是一个匿名用户,通常写作@HOSTNAME。
例如:
mysql>use mysql
mysql>update user set user=”” where host=’%’; 将主机名为%的对应的条目的user值改为空,这样就变成了@%,即任意账号都能远程访问数据库。
mysql>flush privileges;
创建账号:
账号是在mysql数据库下的user表中。
mysql>use mysql
mysql>create user USERNAME@HOSTNAME identified by ‘PASSWORD’;
mysql>flush privileges;
权限系统:
主要功能是认证用户,对数据有一定的权限,额外的功能,管理的权限。
局限性:
1.不能显性的指定一个账户的拒绝权限,即只能定义白名单。
2.密码是全局分配的,不能够单独给指定的数据库,表分配密码。
权限信息是储存在mysql数据库中。
认证阶段:
1.认证账号和用户名。
2.认证账号的权限。
权限分类:
1.administrative privileges
允许用户操作mysql服务器
2.database privileges
数据库的权限
3.privileges for database objects
表,索引,视图
权限信息储存在mysql数据库下的user,db,tables_priv,columns_priv,procs_priv。
user:配置用户账号,全局权限,其他非权限的。
db:数据库级别的权限。
host:已作废,从mysql5.6.7开始就不再创建此表了。
tables_priv:表级别的权限。
columns_priv:列级别的权限。
procs_priv:储存过程和函数相关的权限。
proxies_priv 代理用户权限。
权限的修改:
GRANT 设置权限
mysql>grant PRIV on DBNAME.TABNAME to USERNAME;
REVOKE 取消权限
例如:
mysql>grant select on world.city to 给test用户赋予查询的权限,对象是world数据库下的city表。
账号过期时间:
在mysql5.6.6中新增了password_expried列,定义用户密码过期的选项,默认值是N,但是可以通过ALTER USER来设置成Y。
例如:
alter user ‘root@localhost’ password exprie; 将值设定成Y。
update user set password_pexried =’N’ where host=’localhost’; 将值设定为N。
set password for ‘root@localhost’ = password (‘melody’); 将值设定为N。
访问控制认证:
认证分为2个step。
1.connection verification
验证用户信息:
1.连接的主机名。
2.mysql的用户名。
验证密码;
验证都是通过mysql.userz表中的user,host,password 3个字段中的内容。
账户匹配规则:
1.当服务启动时将user表读入内存中并排序。
2.当用户连接时,从排序的表总匹配记录。
3.有多条可以匹配时,匹配排序后的符合条件的第一条。
查看匹配条目时,使用SELECT CURRENT_USER();查看所匹配的条件。
2.request verification
当step1完成后,将验证相关的权限信息。
user表:全局权限。
db表:database级别的的权限
user字段:空表示匹配匿名用户,不能使用通配符。
通配符可以使用在host和db字段。特别的字符使用\转义字符来进行转义。
host字段:% 和空 代表任意主机。
db字段:%和空,代表任意数据库。
table_priv表
columns_priv表
procs_priv表
%和_可以用在host字段上,%或者空表示任意主机。
db、table_name.column_name,routine_name字段是不能出现%或者是空的。
权限生效时间:
当mysql启动时,读取所有的权限表读进内存。
当对权限表使用了例如GRANT,REVOKE,SET PASSWORD,RENAME USER命令时,服务将立即记录这些修改并且重新加载这些权限表读进内存。
当对权限表使用了例如INSERT,UPDATE,DELETE这些命令时,不会及时生效,直到服务器重启或者是重新加载这些权限表。
重载权限表:
mysql>FLUSH PRIVILEGES
cmd下:
mysqladmin flush_privileges
mysqladmin reload
权限表重载会对每一个当前存在的的会话接造成影响:
1.客户端下次登陆的时候,表和字段的权限会发生改变。
2.客户端下次登录后时候执行use DBNAME的时候,数据库权限会发生改变。
3.全局权限和密码不会对当前会话改变,当有后续会话的时候会发生改变。
如果服务器启动的时候加上了--skip-grant-tables 选项,那么将不会把权限表读至内存中而且不会对账户访问权限做限制,任何账户都能登陆并最任何操作。这样是不安全的。
例如:
忘记数据库root的密码后,可以打开mysql配置文件,在[mysqld]项目下添加skip-grant-tables,并重启mysql服务。
用户管理:
创建用户:
1.CERATE USER or GRANT ,自动的更改权限表的内容。推荐这么做。
mysql>create user ‘USERNAME’@’HOSTNAME’ identified by ‘PASSWORD’; 创建用户
mysql>grant PRIV|ALL on DBNAME.TABLENAME to ‘USERNAME’@’HOSTNAME’; 给账号分配权限。
mysql>drop user ‘USERNAME’@’HOSTNAME’; 删除用户。
2.修改mysql数据库下的权限表,手工添加。
设定账户资源:
max_user_connections 用户的并发数。是全局的权限。
1.每小时查询的次数
2.每小时更新的次数
3.每小时连接服务器的次数
4.单个账号的连接数。
例如:
mysql>create user ‘test’@’localhost’ identified by ‘test’;
mysql>grant all on customer.* to ‘test’@’localhost’
with max_queries_per_hour 20 每小时可以查询的次数
max_update_per_hour 10 每小时可以的更新次数
max_connections_per_hour 5 每小时可以建立连接的连接数
max_user_connections 2; 单个用户可以同时建立的连接数
mysql>grant usage on *.* to ‘test’@’localhost’ with max_queries_per_hour 2;
资源的统计是以账号来统计,不是以连接的客户端来计算的。
想取消全部权限可以使用FLUSH_USER_RESOURCES命令来清零。
设定账户密码:
除了在创建账户的时候设置,可以以使用以下命令设置。
mysql>set password for ‘USERNMAE’@’HOSTNAME’ = password (‘PASSWORD’);
更改当前已登陆的非匿名账户的密码,可以使用如下命令:
mysql>set password = password(‘PASSWORD’);
mysql>grant usage on *.* to ‘USERNAME’@’HOSTNAME’ identified by ‘PASSWORD’; 这是通过grant usage在全局级别修改密码,是不会影响到当前回话的权限的。
也可以通过命令行的方式来更改密码:
>mysqladmin -h HOSTNAME -u USERNAME -p password ‘PASSWORD’; 此时需要输入旧密码才能更改为新密码。
密码过期: