Linux运维:MySQL的介绍和安装的使用
Liunx笔记:MySQL介绍与安装
Ago linux运维群: https://hankbook.cn 笔者QQ:578843228
第1章 介绍
1.1 数据库的种类
数据库的种类
关系型数据库 和 非关系型数据库:NOSQL
关系型数据库:mysql和oracle
非关系型数据库:NOSQL---not only sql
非关系型种类:
键值(key-valua):产品 mencached,redis(这两个比较重要)
列存储(column-oriented):cassandra,hbase(用的少)
面向文档(document-oriented):mongodb(这个重要),couchdb
图形(graph):neo4j,infogrid
1.1.1 关系型数据库知识和特点小结:
1) 关系型数据库在存储数据时实际就是采用的是一张二维表(和word、excell里几乎一样)
2) 市场占有量较大的是MySQL和Oracle数据库,而互联网场景醉常用的是MySQL数据库。
3) 它通过SQL结构化查询语言来存取、管理关系型数据库的数据
4) 关系型数据库在保持数据安全和数据一致性方面很强,遵循ACID理论
1.1.2 非关系型数据库(NOSQL)知识小结:
1)NOSQL数据库不是否定关系数据库,而是作为关系数据库的一个重要补充。
2)NOSQL数据库为了灵活及高性能、高并发而生,忽略影响高性能、高并发的功能。
3)在NOSQL数据库领域,当今的最典型产品为Redis(持久化缓存)、Mongodb、Memcached(纯内存)等。
4)NoSQL数据库没有标准的查询语言(SQL),通常使用REST式的数据接口或者查询API。
1.2 mysql:
特点:
1.mysql性能卓越,服务稳定,很少出现异常宕机
2.mysql开放源代码且无版权制约,自主性及使用成本低
3.mysql历史悠久,社区及用户非?;钤荆龅轿侍猓梢匝扒蟀镏?
4.mysql软件体积小,安装使用简单,并且易于维护,安装及维护成本低
5.mysql品牌口碑效应,使得企业无需考虑就直接用之,LAMP,LEMP流行架构
6.mysql支持多种操作系统,提供多种API接口,支持多种开发语言,特别对流行的PHP语言有很好的支持
1.3 MySQL版本 Alpha Beta RC GA
商业版和社区版 区别:
1.商业版本组织管理与测试环节控制更严格,稳定性方面会比社区版本更稳定
2.mysql是成熟产品,商业版与社区版之间性能方面相差不大
3.商业版不遵循GPL协议,社区版遵守GPL协议可以免费使用
4.使用商业版可以购买相关的服务,享受7*24小时技术支持以及定时打补丁等服务
但是用户必须为此支付服务费用
5.社区版本的维护只能靠社区提供,无法像商业版本获得故障及补丁解决服务了,
但是,使用社区版是完全免费的方式,社区版的服务质量与时效性等方面就无法与
mysql AB公司提供的服务相比了
1.4 MySQL版本选择最终建议:
企业生产场景选择MySQL数据库建议:
1.稳定版,选择开源的社区版的稳定版GA版本
2.产品线:可以选择5.1或5.5.互联网公司主流5.5,其次5.1和5.6
3.选择MySQL数据库GA版发布后6个月以上的GA版
4.要选择前后几个月没有大的BUG修复的版本,而不是大量修复BUG的集中版本
5.最好向后较长时间没有更新发布的版本
6.要考虑开发人员开发程序使用的版本是否兼容你所选择的版本
7.作为内部开发测试数据库环境,跑大概3-6个月的时间
8.优先企业非核心业务采用新版本的数据库GA版本如阿健
9.向DBA高手青椒,或者在及技术氛围好的群里和大家一起交流,使用真正的高手们用过好用的GA版本产品
10.经过上述工序之后,若使没有重要的功能BUG或性能瓶颈,则可以考虑作为任何业务数据服务的后端数据库软件
第2章 部署
部署5.6.34版本
2.1 安装方式
yum 安装
./configure make && makeinstall 5.0-5.1版本
cmake make&& makeinstall 5.4-5.7版本
二进制安装
2.2 查看环境
[root@db02 tools]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@db02 tools]# uname -r
2.6.32-642.el6.x86_64
[root@db02 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
2.3 关闭防火墙和selinux
/etc/init.d/iptables stop
sed -i '#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
setenforce 0
2.4 下载依赖包
yum install ncurses-devel libaio-devel -y
rpm -qa ncurses-devel libaio-devel
2.5 下载编译命令cmake
yum install cmake -y
rpm -qa cmake
2.6 创建用户
useradd -s /sbin/nologin -M mysql
id mysql
2.7 下载源码包并安装
cd /home/aige/tools/
wget http://110.96.193.5/1Q2W3E4R5T6Y7U8I9O0P1Z2X3C4V5B/ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/mysql-5.6.34.tar.gz
ls -l mysql-5.6.34.tar.gz
tar xf mysql-5.6.34.tar.gz
cd mysql-5.6.34
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \
-DMYSQL_DATADIR=/application/mysql-5.6.34/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
make && make install
ln -s /application/mysql-5.6.34/ /application/mysql
2.8 编译参数的说明
-DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.34 \ # 安装目录
-DMYSQL_DATADIR=/application/mysql-5.6.34/data \ # 设定mysql数据文件目录
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.34/tmp/mysql.sock \ # 设定mysql.sock路径
-DDEFAULT_CHARSET=utf8 \ # 这顶默认的字符集为utf-8
-DDEFAULT_COLLATION=utf8_general_ci \ # 设定默认规则
-DWITH_EXTRA_CHARSETS=all \ #
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ # 启用引擎 =1
-DWITH_FEDERATED_STORAGE_ENGINE=1 \ # 禁用引擎 =0
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \ # 启用libz库支持
-DWITH_SSL=bundled \ # 启用
-DENABLED_LOCAL_INFILE=1 \ # 这个参数重复了,启用本地数据导入支持
-DWITH_EMBEDDED_SERVER=1 \ # 编译嵌入式服务器支持
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0 # 禁用debug(默认为禁用)
2.9 编译安装后续操作
\cp /application/mysql/support-files/my-default.cnf /etc/my.cnf
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data/ --user=mysql
chown -R mysql. /application/mysql*
cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
chkconfig mysqld on
chkconfig --list mysqld
/etc/init.d/mysqld start
# cp /application/mysql/bin/mysql /usr/local/sbin/
echo "PATH=/application/mysql/bin/:$PATH" >> /etc/profile
tail -1 /etc/profile
. /etc/profile
echo $PATH
排错路径:
tailf /application/mysql/data/db02.err
设置密码
mysqladmin -u root password 'aige123'
# mysql_secure_installation 交互式
启动命令
# mysqld_safe 2>&1 > /dev/null &
/etc/init.d/mysqld start
在/etc/my.cnf添加这几行。免密码登录
[client]
user=root
password=aige123
2.10 多实例
停止单实例,并清空单实例数据,这里为了方便没清空数据。
/etc/init.d/mysqld stop
chkconfig mysqld off
目录结构
[root@db02 data]# tree /data/
/data/
├── 3306
│ ├── data
│ ├── my.cnf
│ └── mysql
└── 3307
├── data
├── my.cnf
└── mysql
chown -R mysql.mysql /data/
find /data -name mysql|xargs chmod 700
find /data -name mysql|xargs ls -l
cd /application/mysql/scripts
./mysql_install_db --defaults-file=/data/3306/my.cnf --basedir=/application/mysql/ --datadir=/data/3306/data --user=mysql
./mysql_install_db --defaults-file=/data/3307/my.cnf --basedir=/application/mysql/ --datadir=/data/3307/data --user=mysql
/data/3306/mysql start
/data/3307/mysql start
2.10.1 配置文件
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
open_files_limit = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_open_cache = 614
external-locking = FALSE
max_allowed_packet =8M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 100
thread_concurrency = 2
query_cache_size = 2M
query_cache_limit = 1M
query_cache_min_res_unit = 2k
#default_table_type = InnoDB
thread_stack = 192K
#transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
#long_query_time = 1
#log_long_format
#log-error = /data/3306/error.log
#log-slow-queries = /data/3306/slow.log
pid-file = /data/3306/mysql.pid
#log-bin = /data/3306/mysql-bin
relay-log = /data/3306/relay-bin
relay-log-info-file = /data/3306/relay-log.info
binlog_cache_size = 1M
max_binlog_cache_size = 1M
max_binlog_size = 2M
expire_logs_days = 7
key_buffer_size = 16M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
bulk_insert_buffer_size = 1M
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 6
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3306/aige_3306.err
pid-file=/data/3306/mysqld.pid
2.10.2 启动脚本
#!/bin/sh
#init
port=3306
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/${port}/${port}.pid
start(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
sleep 3
else
printf "MySQL is running...\n"
exit 1
fi
}
stop(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit 1
else
printf "Stoping MySQL...\n"
mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
then
kill $mysqld_pid
sleep 2
fi
fi
}
restart(){
printf "Restarting MySQL...\n"
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac
2.10.3 制作3308实例
mkdir -p /data/3308/data
\cp /data/3306/my.cnf /data/3308/
\cp /data/3306/mysql /data/3308/
sed -i 's/3306/3308/g' /data/3308/my.cnf
sed -i 's/server-id = 6/server-id = 8/g' /data/3308/my.cnf
sed -i 's/3306/3308/g' /data/3308/mysql
chown -R mysql:mysql /data/3308
chmod 700 /data/3308/mysql
cd /application/mysql/scripts
./mysql_install_db --defaults-file=/data/3308/my.cnf --datadir=/data/3308/data --basedir=/application/mysql --user=mysql
chown -R mysql:mysql /data/3308
egrep "server-id|log-bin" /data/3308/my.cnf
/data/3308/mysql start
sleep 5
netstat -lnt|grep 3308
2.11 多实例mysql启动和关闭的方法
启动
mysqld_safe --defaults-file=/data/3306/my.cnf 2>&1 > /dev/null &
关闭
mysqladmin -uroot -paige123 -S /data/3306/mysql.sock shutdown
2.12 mysql管理
查看帮助。# ? or help
? contents
help contents
Account Management # 账户管理
Administration # 管理员
Compound Statements # 复合语句
Data Definition # 数据定义
Data Manipulation # 数据操作
Data Types # 数据类型
Functions # 函数
Functions and Modifiers for Use with GROUP BY # 与 GROUP BY相关的函数和修饰符
Geographic Features # 地理特征
Help Metadata # 帮助元数据
Language Structure # 语言结构
Plugins # 插件
Procedures # 存储过程
Storage Engines # 存储引擎
Table Maintenance # 表维护
Transactions # 事物处理
User-Defined Functions # 用户自定义函数
Utility # 实用程序
2.13 安全策略
- 为root用户设置比较复杂的密码(用openssl或者uuid设置)
- 删除无用的mysql库内的用户账号,只保留root@localhost以及root@127.0.0.1
- 删除默认的test数据库
- 增加用户的时候 ,授权的权限尽量最小,允许访问的主机范围最小化
- 登录命令行操作不携带密码,而是回车后输入密码,mysql5.6版本起命令行携带密码会报警提示
删库
mysql -uroot -paige123 -e " drop user ''@'db02';"
mysql -uroot -paige123 -e " drop user ''@'localhost';"
mysql -uroot -paige123 -e " drop user 'root'@'::1';"
mysql -uroot -paige123 -e " drop user 'root'@'db02';"
mysql -uroot -paige123 -e " drop database test;"
为管理员设置密码
密码为空时:
mysqladmin -uroot password 'aige123' # 单实例
mysqladmin -uroot password 'aige123' -S /data/3306/mysql.sock # 多实例
密码不为空时:
mysqladmin -uroot -paige123 password 'aige123' # 单实例
mysqladmin -uroot -paige123 password 'aige123' -S /data/3306/mysql.sock # 多实例
修改密码
mysqladmin -uroot -paige password 'aige123'
mysqladmin -u root password 'aige123'
UPDATE mysql.user SET password=PASSWORD("123") WHERE user='root' and host='localhost';
flush privileges;
忘记密码,忽略授权表修改密码