MySQL
一. 概述
什么是数据库?
数据库可以理解成保存有组织数据的容器(通常是一个文件或一组文件),很多时候我们所说的数据库就是我们使用的数据库软件(专业点就是数据库管理系统DBMS),我们并不是直接访问数据库而是使用数据库软件,它为我们访问数据库。
什么是数据表?
数据表就是我们要存放数据的东西,就像一个图书馆里的书架一样,并不是随便堆到里面就完事了,有人要借书,你需要根据目录(数据库里为索引)很快的找到书在哪排那层哪个位置,从而快速的取出要借的书。
什么是RDBMS?
RDBMS即关系数据库管理系统(Relational Database Management System),是将数据组织为相关的行和列的系统,而管理关系数据库的计算机软件就是关系数据库管理系统.
有哪些RDBMS?
- DB2, IBM公司的产品,起源于世界上第一个关系型数据库System R和System R*。站点:http://www.ibm.com/analytics/us/en/technology/db2/
- Oracle,米国甲骨文公司生产商用产品,它是在数据库领域一直处于领先地位的产品。站点:http://www.oracle.com/cn/database/overview/index.html
- PostgreSQL,Berkeley开发,完全由社区驱动的开源项目,由全世界超过1000名贡献者所维护。PostgreSQL标榜自己是世界上最先进的开源数据库。不过也确实很牛逼,选择什么主要看怎么取舍了。InfoQ这里有一片文章是MySQL和PostgreSQL的一个对比和分析,点我. PostgreSQL官方站点:https://www.postgresql.org/。
- MySQL,开源的一款RDBMS,现在米国甲骨文公司旗下,分社区版和企业版,一般我们使用的都是社区版。官方站点:http://www.mysql.com/
- SQL Server,Microsoft的一款商用RDBMS,官方站点:https://www.microsoft.com/zh-cn/server-cloud/products/sql-server/
- Percona:MySQL优化版,性能更强。官方站点:https://www.percona.com
- Sybase,Infomix,MariaDB等等...
RDBMS的相关术语?
- 数据库(Database):数据库是带有相关数据的表的集合。
- 表(Table):表是带有数据的矩阵。数据库中的表就像一种简单的电子表格。
- 列(Column):每一列(数据元素)都包含着同种类型的数据,比如邮编。
- 行(Row):行(又被称为元组、项或记录)是一组相关数据,比如有关订阅量的数据。
- 冗余(Redundancy):存储两次数据,以便使系统更快速。
- 主键(Primary Key):主键是唯一的。同一张表中不允许出现同样两个键值。一个键值只对应着一行。
- 外键(Foreign Key):用于连接两张表。
- 复合键(Compound Key):复合键(又称组合键)是一种由多列组成的键,因为一列并不足以确定唯一性。
- 索引(Index):它在数据库中的作用就像书后的索引一样。
- 引用完整性(Referential Integrity):用来确保外键一直指向已存在的一行。
什么是SQL?
SQL:Structure Query Language,结构化查询语言,是一种专门用来与数据库通信的语言。遵循的标准主要有:
- SQL-86
- SQL-89
- SQL-92
- SQL-03
- SQL-08
SQL语句分类
Data defination language(DDL):
- CREATE --在数据库中创建对象
- ALTER ---修改数据库结构
- DROP ---删除对象
- RENAME --- 重命名对象
Data Manipulation language(DML)
- SELECT --- 获取数据
- INSERT --- 向表中插入数据
- UPDATE --- 更新表中已有数据
- DELETE --- 删除表中的数据
Data Control Language(DCL)
- GRANT --- 赋予一个用户对数据库或者数据表格等制定权限
- REVOKE --- 删除一个用户对数据库或者表哥的制定权限
Transaction Control Language(TCL)
- COMMIT --- 保存数据操作
- SAVEPOINT --- 为方便Roolback标记一个事务点
- ROOLBACK --- 从最后一次COMMIT中恢复到提交前的状态
二. 安装MySQL
安装MySQL有好多种方式:
- 使用平台包管理器安装, 如apt-get ,yum等
- 下载源码编译安装
- 下载通用二进制包安装
- ...
包管理器安装:
#debian/Ubuntu apt-get install mysql-server -y #RHEL yum install mysql-server -y ...
源码安装(RHEL平台,其他平台大同小异),此处版本是5.5.28,可以下载最新的,大同小异。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对不同平台编译。 1.安装跨平台编译器,cmake: tar xv cmake-3.2.1.tar.gz cd cmake-3.2.1 ./bootstrap make make install 2.编译安装mysql-5.5.28 1.使用cmake编译mysql-5.5 cmake指定编译选项的方式不同于make,其实现方式对比如下: ./configure 相当于 cmake . ./configura --help 相当于 cmake . -LH or ccmake . 指定安装文件的安装路径时常用的选项: -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc 默认编译的存储引擎包括:csv、myisam、myisammrg和heap。如要安装其他存储引擎,可以使用类似如下的选项: -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 若要明确指定不编译某存储引擎,可是使用类似如下的选项: -DWITHOUT_<ENGINE>_STORAGE_ENGINE=1 如: -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 如要编译其他功能,如SSL等,则可以使用如下选项来实现编译时使用某库或不使用某库: -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 其他常用的选项: -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_DEBUG=0 -DENABLE_PROFILING=1 安装Mysql: 创建用户: groupadd -r mysql useradd -r -g mysql -M -s /sbin/nologin mysql 编译: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci make make install 创建数据目录: mkdir -pv /mydata/data && chown mysql /mydata/data 初始化数据库: cd /usr/local/mysql chown mysql:mysql -R /usr/local/mysql scripts/mysql_install_db --user=mysql --datadir=/mydata/data 拷贝文件: cp support-files/my-huge.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld 添加环境变量: vi /etc/profile.d/mysql.sh export PATH=$PATH:/usr/local/mysql/bin source /etc/profile.d/mysql.sh 添加man手册: vi /etc/man.config 添加: MANPATH /usr/local/mysql/man 添加库文件到系统: vi /etc/ld.so.conf.d/mysql.conf 添加: /usr/local/mysql/lib 执行: ldconfig -v /etc/ld.so.conf.d/mysql.conf 添加到自启动: chkconfig --add mysqld
通用二进制包安装:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
===1、准备数据存放的文件系统=== 这里假设其数据盘的目录为/data/mysql,而后需要创建/data/mysql目录做为mysql数据的存放目录。 ===2、新建用户以安全方式运行进程:=== # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M mysql # mkdir /data/mysql # chown -R mysql:mysql /data/mysql ===3、安装并初始化mysql-5.6.26=== # cd /usr/local/src && tar xf mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz -C /usr/local && cd /usr/local/ # mv mysql-5.6.26-linux-glibc2.5-x86_64 mysql && cd mysql # chown -R mysql:mysql . # yum install libaio-devel -y #安装依赖包 # scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql # chown -R root . ===4、为mysql提供主配置文件:=== # vi /etc/my.cnf #贴入下面内容: # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html # *** DO NOT EDIT THIS FILE. It's a template which will be copied to the # *** default location during install, and will be replaced if you # *** upgrade to a newer version of MySQL. [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # These are commonly set, remove the # and set as required. # basedir = ..... # datadir = ..... # port = ..... # server_id = ..... # socket = ..... # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES basedir = /usr/local/mysql datadir = /data/mysql socket = /data/mysql/mysql.sock character-set-server=utf8mb4 collation-server=utf8mb4_general_ci back_log = 600 max_connections = 3000 max_connect_errors = 500 #table_cache = 614 # # #external-locking = FALSE max_allowed_packet = 32M # sort_buffer_size = 2M join_buffer_size = 2M # thread_cache_size = 300 thread_concurrency = 8 query_cache_size = 64M query_cache_limit = 4M #query_cache_min_res_unit = 2k default-storage-engine = InnoDB # thread_stack = 192K # transaction_isolation = READ-COMMITTED # tmp_table_size = 256M max_heap_table_size = 256M long_query_time = 1 slow_query_log = 1 slow_query_log_file=/data/mysql/slow-log.log #log-slow-queries=/data/mysql/slow-log.log binlog_cache_size = 4M max_binlog_cache_size = 8M max_binlog_size = 100M expire_logs_days = 10 key_buffer_size = 2048M read_buffer_size = 1M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 64M #myisam_sort_buffer_size = 128M #myisam_max_sort_file_size = 10G #myisam_max_extra_sort_file_size = 10G #myisam_repair_threads = 1 #myisam_recover skip-name-resolve lower_case_table_names = 1 server-id = 1 innodb_additional_mem_pool_size = 16M innodb_buffer_pool_size = 2G innodb_file_io_threads = 4 innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 16M innodb_log_file_size = 128M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 90 innodb_lock_wait_timeout = 120 innodb_file_per_table = 1 [mysql] default-character-set = utf8mb4 [client] default-character-set = utf8mb4 socket = /data/mysql/mysql.sock ===5、为mysql提供sysv服务脚本:=== # cd /usr/local/mysql # cp support-files/mysql.server /etc/rc.d/init.d/mysqld ===6. 添加至服务列表:=== # chkconfig --add mysqld && chkconfig mysqld on 而后就可以启动服务测试使用了。 为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤: ===7、输出mysql的man手册至man命令的查找路径:=== # yum install man -y # sed -i '48 s@^@MANPATH /usr/local/mysql/man @' /etc/man.config ===8、输出mysql的头文件至系统头文件路径/usr/include:=== 这可以通过简单的创建链接实现: # ln -sv /usr/local/mysql/include /usr/include/mysql ===9、输出mysql的库文件给系统库查找路径:=== # echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf 而后让系统重新载入系统库: # ldconfig -v ===10、修改PATH环境变量,让系统可以直接使用mysql的相关命令。具体实现过程这里不再给出。=== # vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH # . /etc/profile.d/mysql.sh ===11. 启动MySQL服务:=== # service mysqld start
想要使用MySQL来存储并操作数据,则需要做几件事情:
a. 安装MySQL服务端
b. 安装MySQL客户端 (安装完服务器端,默认都带有客户端工具,安装过程略...)
b. 【客户端】连接【服务端】
c. 【客户端】发送命令给【服务端MySQL】服务的接受命令并执行相应操作(增删改查等)
三. 数据库操作:
1. 显示所有数据库:
SHOW DATABASES; #默认数据库: # mysql - 用户权限相关数据 # test - 用于用户测试数据 # information_schema - MySQL本身架构相关数据
2. 使用/进入数据库
USE db_name;
3. 显示库的的所有表
SHOW TABLES;
4. 授权管理
用户管理:
创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename user '用户名'@'IP地址'; to '新用户名'@'IP地址';; 修改密码 set password for '用户名'@'IP地址' = Password('新密码') PS:用户权限相关数据保存在mysql数据库的user表中,所以也可以直接对其进行操作(不建议)
授权管理:
show grants for '用户'@'IP地址' -- 查看权限 grant 权限 on 数据库.表 to '用户'@'IP地址' -- 授权 revoke 权限 on 数据库.表 from '用户'@'IP地址' -- 取消权限
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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