首页 > 技术文章 > 【Python之路Day13】网络篇之MySQL、ORM框架

dubq 2016-07-25 10:44 原文

MySQL

一. 概述

什么是数据库?

数据库可以理解成保存有组织数据的容器(通常是一个文件或一组文件),很多时候我们所说的数据库就是我们使用的数据库软件(专业点就是数据库管理系统DBMS),我们并不是直接访问数据库而是使用数据库软件,它为我们访问数据库。

什么是数据表?

数据表就是我们要存放数据的东西,就像一个图书馆里的书架一样,并不是随便堆到里面就完事了,有人要借书,你需要根据目录(数据库里为索引)很快的找到书在哪排那层哪个位置,从而快速的取出要借的书。

什么是RDBMS?

RDBMS即关系数据库管理系统(Relational Database Management System),是将数据组织为相关的行和列的系统,而管理关系数据库的计算机软件就是关系数据库管理系统.

有哪些RDBMS?

  1. DB2, IBM公司的产品,起源于世界上第一个关系型数据库System R和System R*。站点:http://www.ibm.com/analytics/us/en/technology/db2/
  2. Oracle,米国甲骨文公司生产商用产品,它是在数据库领域一直处于领先地位的产品。站点:http://www.oracle.com/cn/database/overview/index.html
  3. PostgreSQL,Berkeley开发,完全由社区驱动的开源项目,由全世界超过1000名贡献者所维护。PostgreSQL标榜自己是世界上最先进的开源数据库。不过也确实很牛逼,选择什么主要看怎么取舍了。InfoQ这里有一片文章是MySQL和PostgreSQL的一个对比和分析,点我.  PostgreSQL官方站点:https://www.postgresql.org/
  4. MySQL,开源的一款RDBMS,现在米国甲骨文公司旗下,分社区版和企业版,一般我们使用的都是社区版。官方站点:http://www.mysql.com/
  5. SQL Server,Microsoft的一款商用RDBMS,官方站点:https://www.microsoft.com/zh-cn/server-cloud/products/sql-server/
  6. Percona:MySQL优化版,性能更强。官方站点:https://www.percona.com
  7. 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,可以下载最新的,大同小异。

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
cmake编译安装5.5.28

通用二进制包安装:

===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
通用二进制包安装5.6.26


想要使用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地址'      -- 取消权限
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                   

推荐阅读