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的高级服务,取消注释。

spacer.gif

 

然后重新启动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

储存数据量大,数据本身非常小的表格。只支持INSERTSELECT,不支持DELETEREPLACEUPDSTE,同时支持ORDER BYBLOB

 

DBNAME.frm 表格式

DBNAME.ARZ 数据

 

6.MERGE

DBNAME.frm 表格式

DBNAME.MRG 数据

 

设置存储引擎:

CREATE TABLE TABNAME (VAR1VAR2,……) 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字节

intinteger) 4字节

bigint 8字节

小数:

float 4字节

double 8字节

decimal 

所有的小数都可以用(MNM表示精度,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不会。

 

例如:

spacer.gif

 

运算符:

算数运算符:

-*/, %

比较运算符:

<, =, >=, <=, !=<>

逻辑运算符:

与 and &,或or ||,非not 

位运算符;

位与 &,位或|,位异或^,左移<<,右移>>

 

is null 判断是否为空

is not null 判断是否为不空

isnull()函数

 

常用函数:

spacer.gif

 

系统信息函数:

spacer.gif

 

 

账号命名规则:

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数据库下的userdbtables_privcolumns_privprocs_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

 

访问控制认证:

认证分为2step

1.connection verification

验证用户信息:

1.连接的主机名。

2.mysql的用户名。

验证密码;

验证都是通过mysql.userz表中的userhostpassword 3个字段中的内容。

 

账户匹配规则:

1.当服务启动时将user表读入内存中并排序。

2.当用户连接时,从排序的表总匹配记录。

3.有多条可以匹配时,匹配排序后的符合条件的第一条。

查看匹配条目时,使用SELECT CURRENT_USER();查看所匹配的条件。

2.request verification

step1完成后,将验证相关的权限信息。

user表:全局权限。

 

db表:database级别的的权限

user字段:空表示匹配匿名用户,不能使用通配符。

通配符可以使用在hostdb字段。特别的字符使用\转义字符来进行转义。

host字段:和空 代表任意主机。

db字段:%和空,代表任意数据库。

 

table_priv

columns_priv

procs_priv

%_可以用在host字段上,%或者空表示任意主机。

dbtable_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此时需要输入旧密码才能更改为新密码。

 

密码过期: