MySQL数据库概述
MySQL是开源的关系型数据库服务器软件
目前由Oracle公司开发和维护
官方站点:MySQL
MySQL的特点
多线程、多用户
基于C/S(客户端/服务器)架构
简单易用、查询速度快
安全可靠
数据库的基本管理
查看数据库结构
创建及删除库和表
管理表中的数据记录
登录及退出MySQL环境
- 登录MySQL
1. mysql -u 用户名 [-p] 2. 提示符:mysql>
设置mysql用户密码
mysqladmin -u root [-p] password 新密码
退出MySQL
mysql>exit
查看数据库结构
查看数据库列表信息
SHOW DATABASES
查看数据库中的数据表信息
1. USE 数据库名 2. SHOW TABLES
显示数据表的结构
DESCRIBE [数据库名.]表名
数据库的创建和删除
创建新的数据库
CREATE DATABASE 数据库名
创建新的数据表
CREATE TABLE 表名(字段定义...)
删除指定的数据表
DROP TABLE [数据库名.]表名
删除指定的数据库
DROP DATABASE 数据库名
插入,查询数据记录
向数据表中插入新的数据记录
INSERT INTO 表名(字段1, 字段2, ……) VALUES(字段1的值, 字段2的值, ……)
从数据表中查找符合条件的数据记录
SELECT 字段名1,字段名2 …… FROM 表名 WHERE 条件表达式
修改,删除数据记录
修改、更新数据表中的数据记录
UPDATE 表名 SET 字段名1=值1[,字段名2=值2] WHERE 条件表达式
使用UPDATE修改密码
1. mysql> UPDATE mysql.user SET password=PASSWORD('123456') WHERE user='root'; 2. Query OK, 3 rows affected (0.00 sec) 3. Rows matched: 3 Changed: 3 Warnings: 0 4. mysql> FLUSH PRIVILEGES;
在数据表中删除指定的数据记录
DELETE FROM 表名 WHERE 条件表达式
维护数据库及用户权限
设置用户权限(用户不存在时,则新建用户)
GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 [ IDENTIFIED BY ‘密码’ ]
查看用户的权限
SHOW GRANTS FOR 用户名@来源地址
撤销用户的权限
REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址
mysql安装
准备工作
为了避免发生端口冲突,程序冲突等现象,建议先查询mysql软件的安装情况,确认没有使用以RPM方式安装的mysql-server,mysql软件包,否则建议将其卸载。
1. [root@localhost ~]# rpm -q mysql-server mysql 2. 未安装软件包 mysql-server 3. 未安装软件包 mysql
挂载系统盘安装ncurses-devel包
1. [root@localhost ~]# mount /dev/cdrom /mnt 2. mount: /dev/sr0 写保护,将以只读方式挂载 3. [root@localhost ~]# cd /mnt/Packages/ 4. [root@localhost Packages]# rpm -ivh ncurses-devel-5.9-13.20130511.el7.x86_64.rpm 5. [root@localhost ~]#eject
挂载cmake光盘
MySQL 5.X系列版本需要cmake编译安装,所以先安装cmake包
1. [root@localhost ~]# mount /dev/cdrom /mnt 2. mount: /dev/sr0 写保护,将以只读方式挂载 3. [root@localhost ~]# cd /mnt 4. [root@localhost mnt]# tar zxf cmake-2.8.6.tar.gz -C /usr/src 5. [root@localhost mnt]# cd /usr/src/cmake-2.8.6/ 6. [root@localhost cmake-2.8.6]# ./configure && gmake && gmake install
过程较长大概三分钟。
源码编译及安装
- 创建运行用户
为了加强数据库服务的权限控制,建议使用专门的运行用户,如mysql。此用户不需要直接登录到系统,可以不出创建文件夹。
1. [root@localhost ~]# groupadd mysql 2. [root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql
- 解包
挂载mysql源码包解压,释放到/usr/src 目录下,并切换到展开后的源码目录。
1. [root@localhost ~]# mount /dev/cdrom /mnt 2. [root@localhost ~]# cd /mnt 3. [root@localhost mnt]# tar zxf mysql-5.6.36.tar.gz -C /usr/src/ 4. [root@localhost mnt]# cd /usr/src/mysql-5.6.36/ 5. [root@localhost mysql-5.6.36]#
- 配置
将默认使用的字符集设置为utf-8,其他配置如下
[root@localhost mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql:指定将MySQL数据库程序安装到某目录下。
-DSYSCONFDIR=/etc:指定初始化参数文件目录。
-DDEFAULT_CHARSET=utf8:指定默认使用的字符集编码 。
-DDEFAULT_COLLATION=utf8_general_ci:指定默认使用的字符集校对规则,utf8_general_ci是适用于utf-8字符集的通用规则。
-DWITH_EXTRA_CHARSETS=all:指定额外支持的其他字符集编码。
- 编译并安装
[root@localhost mysql-5.6.36]# make && make install
此编译安装时间较长(20分钟左右)
安装后的其他调整
- 对数据库目录进行权限设置
[root@localhost mysql-5.6.36]# chown -R mysql:mysql /usr/local/mysql/
- 建立配置文件
CentOS 7 系统下默认支持MariaDB数据库,因此系统默认的/etc/my.cnf配置文件中是MariaDB的配置文件。而在MySQL源码目录中的support-files文件下,提供了mysql数据库默认的样本配置文件my-default.cnf文件,在启动MySQL数据库服务之前,需要先将原有的my.cnf文件替换为MySQL提供的配置文件内容。
1. [root@localhost mysql-5.6.36]# rm -rf /etc/my.cnf 2. [root@localhost mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
- 初始化数据库
为了能够正常使用MySQL数据库系统,应以运行用户mysql的身份执行初始化脚本mysql_install_db,指定数据存放目录等。
[root@localhost mysql-5.6.36]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
- 设置环境变量
为了方便在任何目录下使用mysql命令,需要在/etc/profile设置环境变量
1. [root@localhost mysql-5.6.36]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile 2. [root@localhost mysql-5.6.36]# . /etc/profile //立即生效
- 添加系统服务
若希望添加mysql系统服务,以便通过systemctl进行管理,可以直接源码包中提供的服务脚本。找到support-files 文件夹下的mysql.server脚本文件,将其复制到/usr/local/mysql/ bin/目录下,并改名为mysqld.sh,然后创建mysql系统服务的配置文件/usr/lib/systemd/system/mysqld.service,将其添加为mysqld系统服务。
1. [root@localhost ~]# cd /usr/src/mysql-5.6.36/ 2. [root@localhost mysql-5.6.36]# cp support-files/mysql.server /usr/local/mysql/bin/mysqld.sh 3. [root@localhost mysql-5.6.36]# chmod +x /usr/local/mysql/bin/mysqld.sh
1. [root@localhost ~]# vim /usr/lib/systemd/system/mysqld.service 2. 配置文件如下 3. [Unit] 4. Description=MySQL Server 5. After=network.target 6. 7. [Service] 8. User=mysql 9. Group=mysql 10. 11. Type=forking 12. PIDFile=/usr/local/mysql/data/localhost.localdomain.pid 13. ExecStart=/usr/local/mysql/bin/mysqld.sh start 14. ExecStop=/usr/local/mysql/bin/mysqld.sh stop 15. 16. [Install] 17. WantedBy=multi-user.target
注释:User=mysql //指定程序运行的用户账号 Group=mysql //指定程序运行的组账号
这样就可以使用systemctl 工具来控制MySQL数据库服务了。mysql服务器默认通过TCP3306端口提供服务。通过编辑/etc/my.cnf配置文件中【mysqld】配置段的“port = 3306” 行,可以更改监听端口。
1. systemctl start mysqld 2. systemctl enable mysqld 3. systemctl status mysqld 4. netstat -anpt | grep mysqld
访问MySQL数据库
- 登录到MySQL服务器
经过安装后的初始化过程,MySQL数据库的默认管理员用户名为root ,密码为空。
没密码登录如下-u选项指定用户
[root@localhost ~]# mysql -u root
有密码登录如下-p选项进行密码校验
[root@localhost ~]# mysql -u root -p
- 执行MySQL操作语句
登陆成功后提示符为“mysql>”的数据库操作环境,用户可以输入各种操作语句对数据库进行管理。
每条MySQL操作语句以分号“;”表示结束,输入时可以不区分大小写,但习惯上将MySQL语句中的关键字部分大写。
执行STATUS;语句可以查看当前数据库服务的基本信息。
1. mysql> STATUS; 2. -------------- 3. mysql Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using EditLine wrapper 4. 5. Connection id: 1 6. Current database: 7. Current user: root@localhost 8. SSL: Not in use 9. Current pager: stdout 10. Using outfile: '' 11. Using delimiter: ; 12. Server version: 5.6.36 Source distribution 13. Protocol version: 10 14. Connection: Localhost via UNIX socket 15. Server characterset: utf8 16. Db characterset: utf8 17. Client characterset: utf8 18. Conn. characterset: utf8 19. UNIX socket: /tmp/mysql.sock 20. Uptime: 4 min 42 sec 21. 22. Threads: 1 Questions: 11 Slow queries: 0 Opens: 67 Flush tables: 1 Open tables: 60 Queries per second avg: 0.039 23. --------------
- 退出MySQL操作环境
1. mysql> QUIT 2. Bye 3. 或者 4. mysql> exit 5. Bye
使用MySQL数据库
查看数据库结构
MySQL是一套数据库管理系统,在每台MySQL服务器中,均支持运行多个库,每个库相当于一个容器,其中存放着许多表,每个表中的每行包含一条具体的数据关系信息,这些信息称为数据记录。
- 查看当前服务器中有哪些库
SHOW DATABASES语句:用于查看当前mysql服务器中包含的库。
1. mysql> SHOW DATABASES; 2. +--------------------+ 3. | Database | 4. +--------------------+ 5. | information_schema | 6. | mysql | 7. | performance_schema | 8. | test | 9. +--------------------+ 10. 4 rows in set (0.00 sec)
- 查看当前使用的库中有哪些表
SHOW TABLES语句:用于查看当前所在的库中包含的表。
1. mysql> USE mysql; 2. Database changed 3. mysql> SHOW TABLES; 4. +---------------------------+ 5. | Tables_in_mysql | 6. +---------------------------+ 7. | columns_priv | 8. | db | 9. | event | 10. ...... 11. | user | 12. +---------------------------+ 13. 28 rows in set (0.00 sec)
MySQL数据库的数据文件存放在/usr/local/mysql/data目录下,每个数据库对应一个子目录,用于存储数据表文件。每个数据表对应为三个文件,扩展名分别为“.frm",".myd"和“.myi”。
- 查看表的结构
DESCRIBE语句:用于显示表的结构,即组成表的各字段(列)的信息。
1. mysql> USE mysql; 2. Database changed 3. mysql> DESCRIBE user; 4. +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 5. | Field | Type | Null | Key | Default | Extra | 6. +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 7. | Host | char(60) | NO | PRI | | | 8. | User | char(16) | NO | PRI | | | 9. | Password | char(41) | NO | | | | 10. | Select_priv | enum('N','Y') | NO | | N | | 11. ......//省略部分 12. +------------------------+-----------------------------------+------+-- 13. 43 rows in set (0.01 sec)
创建及删除库和表
- 创建新的库
1. mysql> CREATE DATABASE 库名; 2. Query OK, 1 row affected (0.00 sec)
刚创建的数据库是空的,其中不包含任何表,在/usr/local/mysql/data 目录会自动生成一个与新建的库名相同的文件夹。
- 创建新的表
mysql> CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型,...);
- 删除一个数据表
1. mysql> drop table 表名; 2. Query OK, 0 rows affected (0.01 sec)
- 删除一个数据库
1. mysql> drop database 库名; 2. Query OK, 0 rows affected (0.00 sec)
实例:创建一个aaa数据库,在aaa下创建一个bbb表,然后删除表后再删除库。
1. mysql> create database aaa; 2. Query OK, 1 row affected (0.00 sec) 3. mysql> use aaa; 4. Database changed 5. mysql> create table bbb (bianhao int,xingming char(4),xingbie char(4)); 6. Query OK, 0 rows affected (0.01 sec) 7. mysql> drop table bbb; 8. Query OK, 0 rows affected (0.01 sec) 9. ysql> drop database aaa; 10. Query OK, 0 rows affected (0.00 sec)
管理表中的数据记录
- 插入数据记录
三种方法:
1. 语法:INSERT INTO 表名(字段1,字段2,...) VALUES (字段1的值,字段2的值,...) 2. 全部插入: 3. mysql> insert bbb values (1,'z3','nan'); 4. Query OK, 1 row affected (0.01 sec) 5. 指定插入: 6. mysql> insert bbb(xingming) values ('lisi'); 7. Query OK, 1 row affected (0.00 sec) 8. 用null值插入: 9. mysql> insert bbb values (null,'w5',null); 10. Query OK, 1 row affected (0.01 sec)
结果如下:
1. mysql> select * from bbb; 2. +--------+----------+---------+ 3. | bianhao | xingming | xingbie | 4. +--------+----------+---------+ 5. | 1 | z3 | nan | 6. | NULL | lisi | NULL | 7. | NULL | w5 | NULL | 8. +--------+----------+---------+ 9. 3 rows in set (0.00 sec)
- 查询数据记录
1. 语法:SELECT * FROM 表名 WHERE 条件表达式; 2. mysql> select * from bbb where xingming='lisi'; 3. +--------+----------+---------+ 4. | bianhao | xingming | xingbie | 5. +--------+----------+---------+ 6. | NULL | lisi | NULL | 7. +--------+----------+---------+ 8. 1 row in set (0.00 sec)
- 修改数据记录
1. 语法:UPDATE 表名 SET 字段名1=字段值1[,字段名2=字段值2] WHERE 条件表达式; 2. mysql> update bbb set xingbie='nan' where xingming='lisi'; 3. Query OK, 1 row affected (0.01 sec) 4. Rows matched: 1 Changed: 1 Warnings: 0
update命令修改用户密码
1. mysql> update mysql.user set password=password('123123') where user='root'; 2. Query OK, 4 rows affected (0.00 sec) 3. Rows matched: 4 Changed: 4 Warnings: 0 4. 5. mysql> flush privileges; //刷新用户授权信息 6. Query OK, 0 rows affected (0.00 sec)
- 清除数据记录
1. 语法:DELETE FROM 表名 WHERE 条件表达式; 2. 3. mysql> delete from bbb where xingming='lisi'; 4. Query OK, 1 row affected (0.00 sec)
数据库用户授权
MySQL数据库的root用户账号拥有对所有库,表的全部权限,频繁使用root 账号会给数据库服务器带来一定的安全风险。在实际工作中通常会建立一些低权限的用户,只负责一部分库,表的管理和维护操作,甚至可以查询,修改,删除记录等各种操作进一步的细化限制,从而将数据库的风险降至最低。
- 授予权限
1. 语法:GRANT 权限列表 ON 库名.表名 TO 用户名@来源地址 [IDENTIFIED BY '密码']; 2. 3. 创建本地登录z3用户对数据库aaa查看权限,密码123456 4. mysql> grant select on aaa.* to z3@localhost identified by '123456'; 5. Query OK, 0 rows affected (0.00 sec)
注意事项如下:
- [权限列表]: 用于列出授权使用的各种数据库操作,以逗号进行分隔,如“select,insert , update”。使用“all”表示所有权限,可授权执行任何操作。
- [库名.表名]: 用于指定授权操作的库和表的名称,其中可以使用通配符“*”。例如,使用“auth.*”表示授权操作的对象为auth库中的所有表。
- [用户名@来源地址]:用于指定用户名称和允许访问的客户机地址,即谁能连接,能从哪里连接。来源地址可以是域名,IP地址,还可以使用“%”通配符,表示某个区域或网段内的所有地址,如"%.aaa.com","192.168.1.%"等。
- [IDENTIFIED BY]:用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略IDENTIFIED BY部分则用户的密码将为空。
- 查看权限
1. 语法:SHOW GRANTS FOR 用户名@来源地址; 2. 3. mysql> show grants for z3@localhost; 4. +-----------------------------------------------------------------------------------------------------------+ 5. | Grants for z3@localhost | 6. +-----------------------------------------------------------------------------------------------------------+ 7. | GRANT USAGE ON *.* TO 'z3'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' | 8. | GRANT SELECT ON `aaa`.* TO 'z3'@'localhost' | 9. +-----------------------------------------------------------------------------------------------------------+ 10. 2 rows in set (0.00 sec)
- 撤销权限
1. 语法: REVOKE 权限列表 ON 数据库名.表名 FROM 用户名@来源地址 2. 3. mysql> revoke select on aaa.* from z3@localhost; 4. Query OK, 0 rows affected (0.00 sec)