数据库简单地分为两种:
关系型数据库 SQL数据库
数据和数据之间是有关系的。通过关系能够将一系列数据都提取出来。
非关系型数据库 NoSQL数据库 (Not only SQL)
关系型数据库MySQL和Oracle区别
其实,这两类数据库在使用方式上,大体是没有太多区别。都是基于SQL查询方式的数据库。但是Oracle是闭源的,也就是收钱的,收了钱自然就好办事,出了问题,有人管。因此,运维并不需要花费太多精力在Oracle上 。要学,去企业学。
MySQL呢?是开源的,免费用的。免费的东西自然是需要我们运维来维护的。但是通常来说,真正的数据库维护人员的职位叫做DBA=database administrator,他并不是广泛意义上的运维。只是数据库专业运维。对于广泛意义上的运维维护人员来说,我们在2万薪资以下只需要简单了解MySQL。
市面上还有一种数据库,关系型,叫做MariaDB。
MySQL数据库最早是开源的,当然现在也是开源的。但是,MySQL已经被Oracle公司===>SUN,他被收购了。那么,MySQL一旦闭源了,怎么办?因此MySQL运维社区的人,为了防止SUN公司对MySQL进行闭源操作,他们自主在MySQL最后一个开源版本的基础上,开放出来了一个分支数据库,叫做MariaDb。其实他和MySQL是几乎一样的。
B/S架构模式与C/S架构模式的区别
B/S==>Web/Server
用户通过Web浏览器打开输入域名就能访问服务器Server的方式叫B/S,
用户不需要安装任何东西
C/S==>Client/Server
所谓客户端Client在用户的电脑是需要下载并安装的。
rpm -qa | grep mysql
查看电脑里有没有mysql,如果有mysql-server删除
rpm -e mysql-server --nodeps
安装ncurses-devel与cmake
yum -y install ncurses-devel
cmake需要编译 需要cmake-2.8.6包
tar xf cmake-2.8.6.tar.gz -C /usr/src/
cd /usr/src/cmake-2.8.6
./configure && gmake && gmake install
安装MySQL
tar xf mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/mysql-5.5.22/
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all && make && make install
创建mysql程序用户
useradd -M -s /sbin/nologin mysql
bin命令目录 data数据目录 support files 提供了很多模板比如启动脚本和 配置文件 scripts 脚本
修改mysql安装目录的属主和属组
cd /usr/local/ chown -R mysql:root /usr/local/mysql
创建修改my.cnf配置文件
/bin/cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
my-huge.cnf 巨大数据量 my-innodb-heavy-4G.cnf innodb引擎
my-large.cnf 大数据量 my-medium.cnf 测试使用 my-small.cnf 小数据量
设置启动脚本
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
启动脚本
chmod +x /etc/init.d/mysqld
chkconfig mysqld --add
chkconfig mysqld --list
添加MySQL命令执行的路径到PATH环境变量
echo “export PATH=$PATH:/usr/local/mysql/bin” >>/etc/profile
也可以创建软连接
ln -s /usr/local/mysql/bin/* /usr/local/bin/
执行mysql_install_db 脚本初始化数据库
/usr/local/mysql/scripts/mysql_install_db --user=mysql
–basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
启动mysql服务 mysql端口3306
/etc/init.d/mysqld start
netstat -antup | grep 3306
连接并登陆mysql
-h 指定主机 不写默认本地 -P 端口 默认3306 -p指定密码
设置mysql密码
mysqladmin -uroot password ‘102846’
mysql用户有两部分组成
用户名@登陆的IP
mysql -uroot -p102846
SQL分类
DDL 数据定义语言 增删改>库。表、索引 create,drop
DML 数据操控语言 增删改>数据 insert,update,delete
DQL 数据查询语言 查询数据 select
DCL 数据控制语言
##建库、删库、建表、删表、查库、查表
show databases;查看数据库列表信息
use 数据库民; 使用库
show tables;查看数据库中的数据表信息
create database 数据库名;创建数据库
drop database 数据库名;删除数据库
create table users(user_name char(20) not null,user_passwd char(30) default ‘’,primary key(user_name)); 创建表 char字符 not null 不能为空 default ‘’默认为空,primary索引关键字
describe 表名; 显示表的字段(结构) 可以简写 desc 表名;
drop table 表名;删除表
增:insert into 表名[字段名] values 具体数值
删:delete from 表名 where 条件
改:update 表名 set 字段=’数值’
查:select 字段名 from 表名
增
insert into users values (‘xiaohong’,‘666666’);不写字段默认插入所有字段,有几个字段就要插入几个值
insert into users (user_name) values (‘xiaoming’);
删
delete from users;删除表所有数据
delete from users where user_name=’xiaoming’;指定删除的位置
改
update users set user_passwd=’888888’ where user_name=’xiaoming’;
只改user_name=’xiaoming’ 的 user_passwd 。不指定条件改全部
查
select * from users; *查看所有数据 需要先use 库
select * from yunjisuan.users; 查看数据 无需use
##权限设置
mysql是写在缓冲里的,是异步存入磁盘
mysql -uroot -p102846 -e‘select * from yunjisuan.user’ 查看磁盘内容
flush privileges 刷新立刻同步到磁盘,立即生效
###修改密码的方法
update mysql.user set password=passwprd(‘666666’) where host=’localhost’;
修改权限后必须刷新同步
修改用户权限(如果没有此账号,则创建用户)
grant all on . to ‘root’@’192.168.200.161’ IDENTIFIED BY ‘123456’
all 代表所有权限(select delete update insert) *.*所有库所有表
添加权限不用输入密码
撤销权限
revoke select on . from ‘yunjisuan’@’192.168.200.135’
添加权限会叠加
客户端下载mysql-client
yum -y install mysql
远程登录mysql
mysql -uyunjisuan -p123123 -h 192.168.200.129
查看账号和IP select user,host from mysql.user;
查看登录的账号 select user();
查看当前登录用户权限 show grants;
查看其它用户权限 show grants for ‘用户名’@’IP地址’
撤销权限
revoke select on . from ‘yunjisuan’@’192.168.200.135’
_:任意单个字符
%:任意多个字符
MySQL日志包括:
错误日志 /use/local/mysql/data/主机名.err
通用查询日志 一般不开
二进制日志
慢速查询日志
记录所有执行时间超过最长时间的SQL语句,可用于找到执行时间长的查询,以用于优化。默认未开启。
开启方法
vim /etc/my.cnf
[mysqld]
long_query_time=5
log-slow-queries=mysql_slow.log
##索引
索引的分类
普通索引:这是最基本的索引类型,而且没有唯一性之类的限制
唯一性索引:与普通索引基本相同,区别在于:索引列的所有值都只能出现一次,即必须唯一,但可为空。
主键:是一种特殊的唯一索引,必须制定为“PRIMARY KEY”,具有唯一性的同时不能为空。
全文索引:
单列索引与多列索引:索引可以是单列上创建的索引,也可以是多列上创建的索引。
事物具有四个性质:ACID
原子性、一致性、隔离性、持久性
begin 开始一个事物
commit提交一个事物
rollback回滚一个事物
show variables like ‘%autocommit%’; 查看系统全局变量,查看自动提交是否开启
set autocommit=0 // 禁止自动提交
set autocommit=1 //开启自动提交
上面是临时修改,永久修改要在配置文件中添加
分类
完全备份:每次对数据进行完整的备份
优点:备份与恢复操作简单方便
缺点:数据存在大量的重复;占用大量空间;备份与恢复时间长
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会
小企业每天一次全备份
大企业每周一次全备 每天都在增备
全备命令 mysqldump 热备份
但是这个命令锁表,使用时用户不能写数据
也可以打包data目录,但是只能在mysql未使用状态才可以 冷备份
mysqldump -uroot -p102846 --databases mysql auth > /backup/mysql+auth-$(date +%F).sql
备份多个库 --databases 备份库
mysqldump -uroot -p102846 --opt --all-databases >/backup/mysql_all.$(date +%F).sql
备份所有库 --opt加快备份速度,当备份数据量大时使用
mysqldump -uroot -p102846 auth user >/backup/auth_user-$(date +%F).sql
备份auth库中的user表
mysqldump -uroot -p102846 -d mysql user >/backup/desc_mysql_user-$(date +%F).sql
备份mysql.user的结构
在mysql里 交互方式
soutce /backup/mysql_all.20160505.sql;
非交互方式
mysql -uroot -p102846 < 备份路径
mysqlbinlog二进制日志
my.cnf
第52行 max_binlog_size=1024000 // 二进制日志最大1M 工作中一般设3M
49 log-bin=mysql-bin 开启二进制日志
命令mysqlbinlog end_log_pos 287 位置
flush logs; 刷新二进制日志
mysqlbinlog --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从日志开头截止到某个时间点恢复
mysqlbinlog --start-datetime=年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从某个时间点到日志结尾恢复
mysqlbinlog --start-datetime=年-月-日 小时:分钟:秒’ --stop-datetime=’年-月-日 小时:分钟:秒’ 二进制日志 | myself -uroot -p102846
从某个时间点到某个时间点恢复
mysqlbinlog --stop-position=’操作 id’ 二进制日志 | mysql -uroot -p102846
mysqlbinlog --start-position=’操作 id’ 二进制日志 | mysql -uroot -p102846
基于位置进行恢复
show master status; 查看位置
binlog日志中 end_log_pos 位置
mysqlbinlog 增量备份文件 | mysql -uroot -p102846
备份的二进制日志内容全部恢复
MySQL常用的两种存储引擎:MyISAM、InnoDB
简单地说,MySQL多实例就是在一台服务器上同时开启多个不同的服务器端口,同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务器端口来提供服务。
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.22 \
> -DMYSQL_DATADIR=/usr/local/mysql-5.5.22/data \ #数据存放目录
> -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.22/tmp/mysql.sock \ #MySQL进程间通信的套接字位置
> -DDEFAULT_CHARSET=utf8 \ #默认字符集为utf8
> -DDEFAULT_COLLATION=utf8_general_ci \ #默认字符集排序规则
> -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \ #额外的字符集支持
> -DENABLED_LOCAL_INFILE=ON \ #是否启用加载本地数据
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #静态编译innodb存储引擎到数据库
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \ #静态编译FEDERATED存储引擎到数据库
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #静态编译blackhole存储引擎到数据库
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ #不编译EXAMPLE存储引擎到数据库
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \ #不支持数据库分区
> -DWITH_FAST_MUTEXES=1 \
> -DWITH_ZLIB=bundled \ #zlib压缩模式
> -DENABLED_LOCAL_INFILE=1 \ #是否启用本地的LOCAL_INFILE
> -DWITH_READLINE=1 \ #使用捆绑的readline
> -DWITH_EMBEDDED_SERVER=1 \ #是否要建立嵌入式服务器
> -DWITH_DEBUG=0 #禁用DEBUG(开启影响性能)
# 提示:编译时可配置的选项很多,具体可参考官方文档
make && make install
设置软链接
ln -s /usr/local/mysql-5.5.22 /usr/local/mysql
ln -s /usr/local/mysql/bin/* /usr/local/bin/
创建MySQL数据目录
mkdir /data/{3306,3307}/data
tree /data tree需要安装
配置文件
##实例3306配置文件my.cnf
[root@localhost ~]# cat /data/3306/my.cnf
[client]
port = 3306
socket = /data/3306/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /data/3306/mysql.sock
basedir = /usr/local/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
#binlog_cache_size = 1M
#max_heap_table_size = 64M
#read_buffer_size = 2M
#read_rnd_buffer_size = 16M
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
#ft_min_word_len = 4
#default-storage-engine = MYISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
#log-bin=mysql-bin
#binlog_format=mixed
#slow_query_log
long_query_time = 1
pid-file = /data/3306/mysql.pid
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
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 = 1
#key_buffer_size = 32M
#bulk_insert_buffer_size = 64M
#myisam_sort_buffer_size = 128M
#myisam_max_sort_file_size = 10G
#myisam_repair_threads = 1
#myisam_recover
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
#innodb_write_io_threads = 8
#innodb_read_io_threads = 8
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
[mysql]
no-auto-rehash
#[myisamchk]
#key_buffer_size = 512M
#sort_buffer_size = 512M
#read_buffer = 8M
#write_buffer = 8M
#[mysqlhotcopy]
#interactive-timeout
[mysqld_safe]
log-error = /data/3306/mysql_yunjisuan3306.err
pid-file = /data/3306/mysqld.pid
[root@localhost ~]# cat /data/3306/mysql
#!/bin/bash
###############################################
#this scripts is created by Mr.chen at 2016-06-25
port=3306
mysql_user="root"
mysql_pwd="" #这里需要修改为用户的实际密码
CmdPath="/usr/local/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
#startup function
function_start_mysql(){
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL....\n"
/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 >/dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
#stop function
function_stop_mysql(){
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
fi
}
#restart function
function_restart_mysql(){
printf "Restarting MySQL...\n"
function_stop_mysql
sleep 2
function_start_mysql
}
case $1 in
start)
function_start_mysql
;;
stop)
function_stop_mysql
;;
restart)
function_restart_mysql
;;
*)
printf "Usage: /data/${port}/mysql{start|stop|restart}\n"
esac
将启动脚本权限改成700 将/data属主属组改为mysql
find /data -name “mysql” | xargs chmod 700
chown -R mysql.mysql
软链接mysql
ln -s /usr/local/mysql/bin/* /usr/local/sbin/
初始化MySQL
chmod +x /usr/local/mysql/scripts/mysql_install_db
cd /usr/local/mysql/scripts
[root@localhost scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3306/data --user=mysql
[root@localhost scripts]# ./mysql_install_db --basedir=/usr/local/mysql --datadir=/data/3307/data --user=mysql
启动MySQL
/data/3306/mysql start
/data/3307/mysql start
启动MySQL
mysql -uroot -p102846 -S /data/3306/mysql.sock
S 指定示例位置
P 指定监听端口
添加密码
mysqladmin -u root -S /data/3306/mysql.sock password ‘102846’
主服务器(Master)
从服务器(Slave)
模式: 1.单向主从同步模式
2.一主多从模式
3.双主双向同步(互为主从模式)
4.单向线性级联同步
5.单向环状级联同步
应用场景:
第一步:从IO线程主动找主IO线程复制binlog日志(这时需要验证)
验证信息都会是什么?
###实践步骤
1.修改主库的配置文件
vim /data/3306/my.cnf
[mysql]
server-id = 1
log-bin = /data/3306/mysql-bin
2. 修改从库的配置文件
vim /data/3307/my.cnf
relay-log = /data/3307/relay-bin
3. 修改后重启mysql服务
4. 在主库中创建主从复制账号
grant replication slave on . to ‘yunjisuan’@’192.168.200.%’ identified by ‘123123’;
flush prvileges;
5. 主从复制需要两个库内容一样,需要将主库全备,然后导入到从库
mysqldump -uroot -p102846 --all-databases -S /data/3306/mysql.sock> /tmp/mysql_all ( d a t e + 3307 交 互 状 态 s o u r c e / t m p / m y s q l a l l (date +%F).sql 3307交互状态 source /tmp/mysql_all (date+3307交互状态source/tmp/mysqlall(date +%F).sql
6. 主库查看位置和binlog文件
show master status;
7. 配置参数
CHANGE MASTER TO
MASTER_HOST=‘192.168.0.200’, #这里是主库的IP
MASTER_PORT=3306, #这里是主库的端口,从库端口可以和主库不同
MASTER_USER=‘yunjisuan’, #这里是主库上建立的用于复制的用户yunjisuan
MASTER_PASSWORD=‘yunjisuan123’, #这里是yunjisuan用户的密码
MASTER_LOG_FILE=‘mysql-bin.000001’, #这里是show master status时查看到的二进制日志文件名称,注意不能多空格
MASTER_LOG_POS=533; #这里是show master status时查看到的二进制日志偏移量,注意不能多空格
#提示:字符串用单引号括起来,数值不用引号,注意内容前后不能有空格
CHANGE MASTER TO MASTER_HOST=‘192.168.200.137’,MASTER_PORT=3307,MASTER_USER=‘yunjisuan’,MASTER_PASSWORD=‘102846’,MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=341;
8.查看主从复制状态
show slave status\G
Slave_IO_Running: yes
Slave_SQL_Running: yes
Seconds_Behind_Master: 0 #0表示已经同步
###MySQL主从复制延迟问题的原因及解决方案
问题一:主库的从库太多,导致复制延迟
从库数量以3~5个为宜,要复制的从节点数量过多,会导致复制延迟
问题二:从库硬件比主库差,导致复制延迟。
查看Master和Slave的系统配置,可能会因为机器配置不当,包括磁盘I/O,CPU,内存等各方面因素造成复制的延迟。这一般发生在高并发大数据量写入场景中。
问题三:慢SQL语句太多
假如一条SQL语句执行时间是20秒,那么从执行完毕到从库上能查到数据至少需要20秒,这样就延迟20秒了。
一般要把SQL语句的优化作为常规工作,不断的进行监控和优化,如果单个SQL的写入时间长,可以修改后分多次写入。通过查看慢查询日志或show full processlist命令,找出执行时间长的查询语句或大的事务。
问题四:主从复制的设计问题
例如,主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。
问题五:主从库之间的网络延迟
主从库的网卡,网线,连接的交换机等网络设备都可能成为复制的瓶颈,导致复制延迟,另外,跨公网主从复制很容易导致主从复制延迟。
问题六:主库读写压力大,导致复制延迟
主库硬件要搞好一点,架构的前端要加buffer及缓存层。
更高版本的MySQL可以支持多线程复制,门户网站则会自己开发多线程同步功能。
出现问题解决方法 SQL no的时候可以临时跳过错误
stop slave;
set global sql_slave_skip_counter=1;
start slave;
数据会不同 但是可以正常主从复制 到时候可以在用户少的时候 锁库 全备主库 恢复到从库
实现对主数据库锁表只读
flush table with read lock;
解锁
unlock tables;
reset slave all; 清除主从复制
show slave status\g 查看主从复制信息
从库禁止写数据,从库权限设置只能读
主从复制代替不了数据同步
数据备份在从库 因为mysqldump备份时会锁库
如果主库和从库的账号系统不一致 不能备份账号系统
也可以在配置文件中设置从库只读,好处备份方便,不用考虑账号不同
【mysqld】
read-only #挡不住超级用户和replication slave(主从复制账号)
mysqldump不能在主库用