数据库工具开发 2020-02-21
一、数据库 概述
什么是数据库?简单来说就是存储数据的仓库、这个仓库它会按照一定的数据结构来对数据进行组织和存储、我们可通过数据库提供的多种方法来管理其中的数据
说比较通俗一点就是计算机中的数据库就是类似于我们存放东西的仓库、它们的区别只是在于存放的东西不同、我们在仓库里面所放的东西为实体物件、而数据库里面所存储的为计算机数据、比如QQ账号与密码、等级、会员
1)数据库种类
在当今的互联网最为常用的数据库模型主要分为两种:关系型数据库(RDBMS)和非关系型数据库(NoSQL)
1、RDBMS
最常见的关系型数据库包括:MySQL、Oracle、SQLServer、Mariadb、Access、PostgreSQL、DB2
关系型数据库可将数据结构归结为二维表格形式、在关系型数据库中、对数据的所有操作均建立在一个或多个表上、通过这些关联的表格进行分类、合并、连接、运算来实现对数据的管理
众所周知、数据的存储方式存在一定的结构、在关系型数据库中、二维表格就是组织数据的基本形式
在每个不同的数据库中包含多个表、而每个表由若干个列组成、一个表有多个列、每个列又存储着不同的信息、数据库中的列(字段)都有相应的数据类型、数据类型定义每个列存储数据的类别、例如为数字、那么可以选择int
2、NoSQL
最常见的非关系型数据库包括:Redis、MemCached、MongoDB、HBase、Cassandra
非关系型数据库也称为NoSQL数据库、它的出现并不是要终结关系型数据库、而是作为传统关系型数据库的一个有效补充
随着Web2.0的兴起、传统的关系型数据库在应对这些高并发网站时已经显得力不从心、暴露出了很多难以克服的问题、比如高并发、高扩展、高可用、I/O瓶颈、性能瓶颈都难以突破
于是针对这些场景NoSQL数据库应用而生、在这些场景下NoSQL数据库可以发挥出难以想象的效率和性能、近几年来NoSQL这个术语得到了广泛认同
NoSQL打破了长久以来关系型数据库的ACID理论、而且NoSQL的数据存储结构无需固定的表结构、在大数据的存取上有着关系型数据库无法比拟的优势、但是NoSQL数据库没有标准的查询语言、通常使用查询API
2)MySQL 概述
MySQL是一个开源的中小型关系型数据库管理系统、由瑞典MySQLAB公司开发、是一个多线程多用户的SQL数据库服务、目前MySQL被广泛应用于大中小型网站
由于它的高性能、速度快、体积小、成本低、源码开放等特点、因此有许多企业选择它来作为网站数据库、以此来降低成本
同时MySQL也是一个C/S架构、由一个服务端守护进程mysqld和不同的客户端程序以及库组成、随着技术的成熟、MySQL支持的功能也越来越多、性能也在不断的提高、对平台的支持也在增多、因此深受广大用户的喜爱
1、为何选择 MySQL
选择MySQL作为后端的数据存储方式既成事实、那MySQL又有哪些优点呢?
(1)源码开放、无版权制约、自主性强、使用成本低
(2)软件体积小、性能稳定、速度快、使用简单、易于维护
(3)跨平台、支持多种操作系统、提供了多种API、支持多种开发语言
2、MySQL 命名介绍
MySQL数据库软件由3个数字和一个后缀组成、例如:mysql-5.7.27.tar.gz、其含义如下:
第一个数字:代表主版本号、描述了文件格式
第二个数字:代表发行级别、主版本号与发行级别组合一起便构成了发行序列号
第三个数字:代表发行系列的版本号、随着每个新分发版而递增
提示:每次更新后、版本字符串的最后一个数字会递增、如果增加了新的功能、那么字符串的第二个数字会递增、如果文件格式改变、那么第一个数字会递增
3、RDBMS 术语
库: 数据库为一些关联表的集合
表: 由一个行和列组成的二维表、具有固定列和任意的行数
行: 为相同属性的对象中的一个
列: 为对应数据库中存储对象的共有的属性
索引: 类似于书籍的目录、我们可以使用索引来快速访问表中的特定信息
主键: 主键是唯一的、一个表中只能包含一个主键、可以使用主键来查询数据
外键: 外键用于关联两个表
冗余: 存储两倍数据、冗余虽然降低了性能、但也提高了数据的安全性
3)MySQL 数据类型
数据类型是数据的一种属性、用于指定对象可保存的数据类型、如整数、字符串、日期和时间等、MySQL支持多种数据类型、其大体上我们可以将其分为三类:数值类型、日期和时间类型、字符串类型
int: 主要数据类型、大多数数值类型都可以使用这种数据类型、占4字节空间
char: 存储固定长度、非Unicode字符数据、该数据类型最多包含8000个字符
varchar: 存储可变长度、非Unicode字符数据、与char的区别为、存储的长度不是列长、而是数据的长度
nchar: 用于存储定长Unicode字符数、使用的字节数在空间上增加了一倍
nvarchar: 用于存储变长Unicode字符数、使用的字节数在空间上增加了一倍
date: 表示日期、占用3字节空间
time: 表示一天中的某个时间、占用5字节空间
datetime: 表示日期和时间、占用8字节空间
bigint: 相当于int的扩展、如果要存储的整数值超过了int即可使用它、占用8字节空间
tinyint: 用于存储有限数值、即0-255之间的整数、占1字节空间
bit: 值只能是0、1或NULL、存储只有两种可能的值、Yes或No、True或False、On或Off
money: 表示钱和货币值、占用8字节空间
text: 用于存储大量非Unicode字符数据
二、MySQL 部署
1)下载软件包
[ ~]# wget -c https://downloads.mysql.com/archives/get/file/mysql-5.7.27.tar.gz [ ~]# wget -c https://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
2)安装相应的依赖包
[ ~]# yum -y install ncurses ncurses-devel cmake libaio libaio-devel pcre pcre-devel zlib zlib-devel bison bison-devel libverto libverto-devel libstdc++ libstdc++-devel dbus dbus-devel libss libss-devel gcc gcc-c++ autoconf m4 libgcc e2fsprogs perl-Data-Dumper
3)为MySQL创建运行用户与组
[ ~]# groupadd mysql [ ~]# useradd -M -s /sbin/nologin mysql -g mysql
4)解压boost工具、并移动到指定位置即可、无需编译安装
[ ~]# tar xf boost_1_59_0.tar.gz [ ~]# mv boost_1_59_0 /usr/local/boost
5)编译安装MySQL
[ ~]# tar xf mysql-5.7.27.tar.gz -C /usr/src/ [ ~]# cd /usr/src/mysql-5.7.27/ [ mysql-5.7.27]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=ON -DWITH_DEBUG=0 -DWITH_BOOST=/usr/local/boost -DWITH_FEDERATED_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock make -j 8 && make install -j 8 && cd ~
6)编译安装完成以后、创建对应的目录、并调整相应的参数
[ ~]# mkdir /usr/local/mysql/pid [ ~]# mkdir /usr/local/mysql/logs [ ~]# mkdir /usr/local/mysql/socket [ ~]# mkdir /usr/local/mysql/tmp [ ~]# mkdir /usr/local/mysql/ibtmp [ ~]# mkdir /usr/local/mysql/binlog [ ~]# mkdir /usr/local/mysql/relaylog [ ~]# mkdir /usr/local/mysql/outcsv/ [ ~]# mkdir /usr/local/mysql/ibdata [ ~]# mkdir /usr/local/mysql/undolog [ ~]# mkdir /usr/local/mysql/redolog [ ~]# chown -R mysql:mysql /usr/local/mysql [ ~]# chmod -R 750 /usr/local/mysql/outcsv [ ~]# echo ‘export PATH=/usr/local/mysql/bin:$PATH‘ >> /etc/profile [ ~]# source /etc/profile
7)定义MySQL配置文件
[ ~]# cat > /etc/my.cnf << EOF [client] port = 3635 socket = /usr/local/mysql/socket/mysql.sock [mysqld] user = mysql port = 3635 federated skip_ssl bind_address = 0.0.0.0 max_connections = 3600 max_connect_errors = 200 autocommit = ON skip-name-resolve symbolic-links = 0 skip-external-locking log_timestamps = system explicit_defaults_for_timestamp = ON transaction_isolation = read-committed binlog_gtid_simple_recovery = ON show_compatibility_56 = ON transaction_write_set_extraction = OFF socket = /usr/local/mysql/socket/mysql.sock pid-file = /usr/local/mysql/pid/mysql.pid log-error = /usr/local/mysql/logs/mysql_error.log secure-file-priv = /usr/local/mysql/outcsv innodb_tmpdir = /usr/local/mysql/ibtmp basedir = /usr/local/mysql datadir = /usr/local/mysql/data tmpdir = /usr/local/mysql/tmp character-set-server = utf8 init_connect = SET NAMES utf8 collation-server = utf8_general_ci slow_query_log = ON long_query_time = 1 min_examined_row_limit = 960 log_slow_admin_statements = ON log_slow_slave_statements = ON log_queries_not_using_indexes = OFF slow_query_log_file = /usr/local/mysql/logs/mysql_slow.log back_log = 360 tmp_table_size = 64M max_allowed_packet = 64M max_heap_table_size = 64M sort_buffer_size = 1M join_buffer_size = 1M read_buffer_size = 2M read_rnd_buffer_size = 2M thread_cache_size = 64 thread_stack = 256K query_cache_size = 32M query_cache_limit = 2M query_cache_min_res_unit = 2K table_open_cache = 4096 open_files_limit = 65535 connect_timeout = 9 interactive_timeout = 21600 wait_timeout = 21600 innodb_data_file_path = ibdata1:12M;ibdata:12M:autoextend innodb_autoextend_increment = 12 innodb_data_home_dir = /usr/local/mysql/ibdata innodb_undo_tablespaces = 4 innodb_undo_logs = 128 innodb_max_undo_log_size = 1G innodb_undo_log_truncate = ON innodb_purge_rseg_truncate_frequency = 10 innodb_undo_directory = /usr/local/mysql/undolog innodb_log_file_size = 128M innodb_log_buffer_size = 16M innodb_log_files_in_group = 3 innodb_flush_log_at_trx_commit = 2 innodb_flush_log_at_timeout = 1 innodb_flush_method = O_DIRECT innodb_log_group_home_dir = /usr/local/mysql/redolog innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G innodb_fast_shutdown = 0 default-storage-engine = InnoDB innodb_buffer_pool_size = 2G table_open_cache_instances = 8 innodb_buffer_pool_chunk_size = 256MB innodb_page_size = 16k innodb_sort_buffer_size = 1MB innodb_file_per_table = ON innodb_large_prefix = ON innodb_purge_threads = 8 innodb_page_cleaners = 8 innodb_read_io_threads = 8 innodb_write_io_threads = 8 innodb_thread_concurrency = 16 innodb_flush_neighbors = 0 innodb_lru_scan_depth = 1024 innodb_lock_wait_timeout = 60 innodb_print_all_deadlocks = ON innodb_deadlock_detect = ON innodb_strict_mode = ON innodb_buffer_pool_load_at_startup = ON innodb_buffer_pool_dump_at_shutdown = ON EOF
8)对MySQL进行初始化
[ ~]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data [ ~]# echo $? 0
9)将MySQL添加为系统服务
[ ~]# cp /usr/local/mysql/support-files/mysql.server /usr/local/mysql/bin/mysql.sh [ ~]# chmod +x /usr/local/mysql/bin/mysql.sh [ ~]# cat > /usr/lib/systemd/system/mysql.service << EOF [Unit] Description=MySQL After=network.target [Service] User=mysql Group=mysql Type=forking PrivateTmp=false LimitNOFILE=65535 ExecStart=/usr/local/mysql/bin/mysql.sh start ExecStop=/usr/local/mysql/bin/mysql.sh stop [Install] WantedBy=multi-user.target EOF
10)启动MySQL并为root用户设置密码
[ ~]# systemctl start mysql [ ~]# systemctl enable mysql [ ~]# netstat -anput | grep mysql tcp 0 0 0.0.0.0:3635 0.0.0.0:* LISTEN 34411/mysqld [ ~]# mysql -e"update mysql.user set authentication_string=password(‘abc-123‘) where user=‘root‘;flush privileges;"
【只是为了打发时间】