码迷,mamicode.com
首页 > 数据库 > 详细

MySQL

时间:2018-11-23 21:28:42      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:server   不能   完整性   实现   超过   cmak   阵列   数据表   value   

一、MySQL概述
1、MySQL介绍
MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓库里,这样的设计增加了MySQL的读取速度,而且灵活性和可管理性也得到了很大提高。访问及管理MySQL数据库的最常用标准化语言为SQL结构化查询语言。
Mysql端口3306   netatat -antup | grep 3306
2、数据库简单分为两种(第三种不确定)
关系型数据库-------->MySQL和Orache和postgrepsql
非关系型数据库------->Memcached和Redis
搜索引擎数据库------->elasticsearch
时间序列数据库-------> influxDB
列数据库 hbase
图形数据库 mongodb
消息队列中间件
c、什么叫关系型数据库
数据和数据之前是有关系的,通过关系能够将一系列数据都提取出来。
d、什么是非关系型数据库?
NoSQL数据库--->Not only SQL
3、MySQL和Orache的区别
其实这两类数据库在使用方法上,大体是没有太多区别的,都是基于SQL查询方式的数据库。
a、Oracle
Oracle是闭源的,收费的,收了钱自然好办事,出了问题有人管;因此,我们运维并不需要花太多的精力在Oracle上,要学取企业学。原因是Oracle为了不让企业因为一点小事就去找他,通常,专业的Oracle公司会给客户的运维人员进行培训。
b、MySQL
MySQL是开源的,免费使用,需要我们运维来维护;但是通常来说,真正的数据库维护人员叫做DBA---->database administrator,它并不是广泛意义上的运维,只是数据库专业运维,对于广泛意义上的运维人员来说,我们在两万薪资以下,只需要简单了解MySQL。
两万以上---->运维总监,需要具备两个能力,初级DBA和开发。
c、MariaDB
市面上的另一种数据库,MariaDB;MySQL数据库最早是开源的,现在也是开源的。但是,MySQL已经被Orache的SUN公司收购了。因此MySQL运维社区的人,为了防止SUN公司对MySQL进行闭源操作,他们自主在MySQL最后一个开源版本的基础上开发出一个分支数据库MariaDB。它和MYSQL几乎是一样的,因此,以后如果听到这个数据库,不要紧张。
 
4、B/S架构和C/S架构模式的区别
B/S====>Web/Server
C/S====>Client/Server
B/S:用户通过Web浏览器打开输入域名就能访问服务器Server的方式叫做B/S;用户不需要安装任何东西;主要是基于浏览器缓存,性能低
C/S:在用户电脑里需要下载并安装客户端Client,可直接调用CPU、内存,性能高。
二、编译安装MYSQL
1、准备工作
卸载rpm方式安装的mysql-server、mysql
rpm -qa | grep mysql
mysql-libs-5.1.71-1.el6.x86_64
若存在server mysql
用rpm -e mysql-server mysql --nodeps命令卸载
yum也能安装,不过yum安装的是5.1版本,我们要用5.5版本
安装ncurses-devel与cmake包
yum -y install ncurses-devel
tar xf cmake-2.8.6.tar.gz -C /usr/src
cd /usr/src/cmake-2.8.6
./configure && gmake && gmake install
2、源码编译及安装
增加程序用户mysql
useradd -M -s /sbin/nologin mysql
解压mysql-5.5.22.tar.gz
tar xf mysql-5.5.22.tar.gz -C /usr/src
cmake配置,编译及安装
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
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql  //主程序安装目录
-DDEFAULT_CHARSET=utf8                //默认字符集为utf8
-DDERAULT_COLLATION=utf8_general_ci     //默认的字符集校对规则
DWITH_EXTRA_CHARSETS=all              //安装所有字符集
-DSYSCONFDIR=/etc                      //配置文件存放目录
 
 

3、安装后的优化操作
修改Mysql安装目录的属主和属组
chown -R mysql:root /usr/local/mysql/
创建修改my.cnf配置文件
/bin/cp /usr/local/mysql/support-files/my-medium.conf /etc/my.cnf
my.cnf 配置文件相关介绍,在mysql解压路径support-files/下提供的模板:
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
加x权限
chmod +x /etc/init.d/mysqld
chkconfig mysqld --add
chkconfig mysqld --list
mysqld  0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
 
添加Mysql命令执行的路径到PATH环境变量
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/progile
In -s /usr/local/mysql/bin/* /usr/local/bin
两种方法选一,为的是让环境变量能找到这个命令
date目录就是Mysql的数据目录,数据目录下是可以有很多的小库的;date目录下面的子目录就是一个一个的小库,每个小库的库名,就是子目录的名字。而子目录里面装的,就是对应的数据文件
执行mysql_install_db脚本初始化数据库
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/
--basedir=/usr/local/mysql/        //指定安装路径
--datadir=/usr/local/mysql/data    //指定数据目录,
我们也可以告诉它其他目录,那么它就可以把数据写在其他目录下
--user=mysql                 //指定用户的身份
启动mysql服务,并查看运行状态
/etc/init.d/mysqld start
netstat -anput | grep 3306
连接并登陆到mysql操作环境
Mysql -u 指定用户名 (-uroot)默认的
     -p  指定密码   ()默认空密码登陆
     -h  指定主机 (127.0.0.1)默认的
     -P  指定端口 
[root@]# mysql
或[root@]# mysql -uroot -p
后面没加参数,有默认参数
退出登陆
quit、exit或ctrl+D
设置数据库的用户名密码
mysqladmin -uroot password ‘123123‘
mysql -uroot -p123123
三、mysql数据库操作
1、SQL语句概述
SQL语言是(Structured Query Language的缩写,即结构化查询语言),是关系型数据库的标准语言,用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能。
SQL分类:
 

2、数据库表的管理操作
注:大部分命令不区分大小写
a、查看数据库结构
查看数据库列表信息
格式:show databases;
查看数据库中的数据表信息
格式:use 数据库名    show tables;
显示数据表的结构(字段)
格式:describe【数据库.】表名
 eg:   desc uses;
  describe uses;
describe mysql.user;
use mysql;   describe user;
creat创建新库创建新表
格式:create database 数据库名;
 create table 表名;
示例:
create database auth;   //新建一个名为auth的数据库
use auth;   //使用auth这个数据库
create table users (user_name char(20) not null, user_passwd char(30) default ‘‘, primary key (user_name));
//在auth库中创建名为user的表,表内两个字段为(user_name 最多20字节,不能为空, user_passwd最多30字节默认为空,索引关键字user_name )
drop删除库、删除表
格式:drop table [数据库名]表名;
drop database 数据库名;
3、对表里的数据进行操作的SQL语句
a、select查询语句
use yunjisuan
select * from uses;  如果不写加个*,默认看所有
select 字段,字段 from 空间.表名;
eg:  select user,host,password from mysql.user;
看系统库mysql里的user表里的user、host、password字段
select * from mysql.user\G   把横着的数据自动换行(变竖着显示)
desribe yunjisuan.users;  查看表头(看表结构)
use mysql;   describe user;    (简单记法desc 空间名.表明;)
b、insert插入新数据
insert into uses values (‘插入的内容‘,‘插入的内容‘) 
insert into 空间名.表名 (字段名1,字段名2)  values (值1,值2)
把值查到前面的字段
###这条命令没有指定插入哪个字段,默认是插所有的,按顺序放,有几个字段,就要插入几个,不然报错
 

指定插入哪个字段
insert into 空间名.表明 (字段) values (‘值‘)
###在表中的user_name字段中添加baibai,没插入的,默认是空
c、update更改原有数据
update 空间名.表名 set 字段=’值’ where 字段=’原值’;
update uses set user_passwd=‘888888‘;
###没有写更改哪个字段的数据,默认把那一栏的所有的改成888888

update uses set user_passwd=‘999999‘ where user_name=‘baibai‘;
###给设定条件,更改user_passwd的那一栏后面加条件baibai那一栏就行修改,这样满足这一行的条件,只能是那一行的数据了
d、delete删除
delete from 空间名.表名 where 字段=’原值’;
delete from uses where user_name=‘baibai‘;
清空user_name下baibai那一栏数据;如果后面不加条件,就直接把整个表清空了;!!!很危险!!
e、刷新flush privileges;
使输入的内存中的数据,立刻写入硬盘中保存,立即生效。
4、直接看数据库硬盘中得数据
在命令界面,直接输入命令,看数据库中的数据
mysql -uroot -p123123 -e ‘select 字段名 from 空间名.表名’
实体案例:
create table aodi (岗位类别 char(20) not null, 姓名 char(20) not null, 年龄 int, 员工ID int not null, 学历 char(6), 年限 int, 薪资 int not null, primary key (员工ID));
insert into imployee_salary.aodi values (‘网络工程师‘,‘孙空武‘,27,011,‘本科‘,3,4800);
insert into imployee_salary.aodi values (‘WINDOWS工程师‘,‘蓝凌‘,19,012,‘中专‘,2,3500);
insert into imployee_salary.aodi values (‘LINUX工程师‘,‘姜纹‘,32,013,‘本科‘,8,15000);
insert into imployee_salary.aodi values (‘JAVA工程师‘,‘关园‘,38,014,‘大专‘,10,16000);
insert into imployee_salary.aodi values (‘硬件驱动工程师‘,‘罗中坤‘,29,015,‘大专‘,9,16500);
为什么用update修改密码登陆不上去
因为我们在创建用户的时候,密码是加密存到数据库里的,我们在登陆输入密码时候虽然是明文的,但是系统会加密以后跟数据库里的密码进行比对。如果我们用date修改密码文件,里面的内容不是加密的,我们再用新密码登陆,系统还是会给新密码加密与数据库里面的密码进行对比;所以就登陆不上去了
修改密码解决方法
所以我们用update修改密码的时候,要调用一个加密函数进行修改
update mysql.user set password=password(‘123123’) where user=’root’;
密码经过password()的函数进行加密,传到密码文件里,保存进去。
然后需要刷新(修改跟账号有关的必须刷新)flush privileges;
四、用户权限设置grand
Mysql账号的组成:用户名@登陆IP
所以Mysql的账号就限制了它登陆的位置
1、设置用户权限(用户不存在,则新建用户)
grant all on *.* to ‘root’@’192.168.1.108’ identified by ‘123456’;
#all 代表 赋予所有权限:增删改查等其他权限  可以把all换成其他的单一权限,比如select
#on后面的 *.* 代表库名.表名 赋予修改所有库加所有表,如果是mysql.*就代表赋予mysql库下的所有表
#root@IP 代表用户名@登陆IP
#IDENTIFIED BY‘123456’ 代表设置密码
#这种登陆是远程登陆,登陆时候后面一定要加-h和设置的IP,不然默认的是本地登陆-h 127.0.0.1(localhost)
#不写-h默认是localhost 所以要想不加-h登陆,我们要创建一个登陆IP是localhost的账号
2、查看用户权限
查看当前用户权限:show grants;
查看其他用户权限:show grants for ‘用户名’@’IP地址’;
3、撤销一个权限
revoke seleck on 库名.表名 from ‘用户名@IP地址’;
flush privileges;
4、Mysql通配符
_  任意单个字符
%  任意长度的任意字符
eg:’root’@’192.168.154.%’  root账号在192.168.154这个网段都能登陆
eg:’root’@’%’             root账号在任意IP都能登陆
eg:’root’@’192.168.154.1_’  root账号在192.168.154.10~19 都能登陆
flush privileges;
5、Mysql其他常用命令
用于显示广泛的服务器状态信息
show status;
显示创建特定数据库或表
help create database;
help create tables;
显示授权用户的安全权限
show grants;
显示当前连接用户
mysql> select user();
显示当前时间
mysql> select now();
显示当前用户及时间
mysql> select CURRENT_USER(),CURRENT_TIMESTAMP;
mysql> select user(),now();
显示当前数据库
mysql> select database();
显示服务器状态
mysql> status;
数据库的备份和恢复
方法一:可直接备份目录 /var/local/mysql/var
方法二:使用专用备份工具 mysqldump
备份操作
mysqldump -u 用户名-p [密码][选项][数据名][表名]>/备份名路径/备份文件名
常见选项
--all-databases
--opt
#mysqldump -u root -p mysql user > mysql-user.sql
Enter password:
#mysqldump -u root -p --database auth > auth.sql
Enter password:
#mysqldump -u root -p --opt --all-databses > all-data.sql
Enter password:
恢复操作
mysql -u root -p [数据库名] < /备份路径/备份文件名
#mysql -u root -p test < mysql-user.sql
Enter password:
五、Mysql完全备份mysqldump
1、mysqldump命令备份
Mysqldump这个命令会阻塞数据库的写入,自动锁表,所以我们用这个命令的时候是在从库上用的;
因为从库一般都是只供读请求。
(1)对单个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项][数据库名] > /备份路径/备份文件名
实例:mkdir /backup
mysqldump -uroot -p123123 --databases yunjiusan > /backup/auth-$(date +%F).sql
echo $?
0
(2)对多个库进行完全备份
格式:mysqldump -u 用户名 -p [密码][选项] --databases 库名1[库名2]...> /备份路径/备份文件
实例:mysqldump -uroot -p123123 --databases mysql auth > /backup/mysql+auth-$(data +%F).sql
(3)对所有库进行备份
格式:mysqldump -u 用户名 -p [密码][选项] --all-databases > /备份路径/备份文件
实例:mysqldump -uroot -p123123 --opt --all-databases > /backup/mysql_all.$(date +%F).sql
--opt 加快备份速度,当备份数据量大时候使用
mysqldump -uroot -p123123 --opt --all-databases | gzip -9 > /tmp/xxx$(data +F%).sql
备份要进行压缩,不然太大了

(4)对表进行备份
格式:mysqldump -u 用户名 -p [密码][选项] 数据库名 表名 > /备份路径/备份文件
实例:mysqldump -uroot -p123123 yunjisuan user > /backup/user-$(data +%F).sql
(5)对表结构进行备份
格式:mysqldump -u 用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名
实例:mysqldump -uroot -p123123 -d mysql user > /backup/desc_mysql_user-$(data +%F).sql
2、打包数据库备份
直接打包数据库文件夹,如/usr/local/mysql/data/ 或 /var/lib/mysql/
需要先停库
/etc/init.d/mysqld stop
yum -y install xz
tar jcf mysql_all-$(data+%F).tar.xz /usr/local/mysql/data/
tar:从成员名中删除开头的“/”
tar xf mysql_all-2016-05-05.tar.xz
mkdir bak
模拟数据丢失
mv /usr/local/mysql/data/* bak/
恢复数据:
tar xf mysql_all-2016-05-05.tar.xz
cd usr/local/mysql/data/
mv */usr/local/mysql/data/
3、恢复数据库
(1)交互式恢复
进入数据库中恢复
source /backup/mysql_all.20180505.sql
(2)非交互式恢复
在命令界面恢复
mysql -u用户名 -p[密码] < 数据库的备份路径
mysql -u用户名 -p[密码] 库名 < 表的备份路径

查看
mysql -uroot -p123123 -e ‘show databases’
(3)定时备份脚本
简单版:
复杂版:
 

备份过程压缩
mysqldump -uroot -p123123 --databases yunjiusan | gzip -p > /tmp/yunjisuan.gz

六、增量备份
利用二级制日志进行增量备份
二进制日志默认最大是1M (可修改)
vim /etc/my.cnf
52 max_binlog_size = 1024000
如果一个日志到达1M大小,会自动生成一个新的日志
我们也可以强制刷新一个新的日志文件
flush logs
看当前状态 show master status;
1、开启binlog日志
vim /etc/my.cnf
49 log-bin=mysql-bin
112 #log-bin=mysql-bin
重启mysql
/etc/init.d/mysqld restart
查看二进制日志文件的命令  mysqlbinlog
eg: mysqlbinlog mysql bin.000001
2、增量恢复
(1)一般恢复:
将备份的二进制日志内容全部恢复
格式:mysqlbinlog 增量备份文件 | mysql -u用户名 -p密码
(2)基于时间点恢复:
跳到某个发生错误的时间点进行恢复
格式:
从日志开始到截至的某个时间点进行恢复:
mysqlbinlog --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间开始到日志的末尾进行恢复:
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
从某个时间点到某个时间点进行恢复:
mysqlbinlog --start-datatime=’年-月-日 小时:分:秒’ --stop-datatime=’年-月-日 小时:分:秒’ 二进制日志 | mysql -u用户名 -p密码
(3)基于位置恢复
可能在同一时间点既有错误的操作也有正确的操作,基于位置恢复更精准
格式:
mysqlbinlog --stop-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
mysqlbinlog --start-position=’操作id’ 二进制日志 | mysql -u用户名 -p密码
看自己目前的位置
show master status;
3、企业备份策略
a、在中小公司,由于数据量小,数据的完整性不是特别重要,允许小数量的细节数据丢失。因此,只需每天进行一次数据的全量备份即可;===>定时任务+全备脚本
b、中大型公司,由于数据量大,每天全备时间太长,而且比较关注数据的安全和完整,无法承受数据丢失,哪怕只是少量的数据;对于这种类型的公司,我们通常采取全量备份+增量备份的方式来进行。
也就是每周进行一次全量备份====>定时任务+全备脚本
每天进行一次增量备份,binlog二进制日志方式。
4、中小企业数据库全量备份如何实现
第一种:推送
采用rsync备份服务器:
数据库定时任务结束后,自动rsync推送到备份服务器
第二种:raid阵列
在mysl服务器上,额外进行raid磁盘阵列的挂载
可挂载到/data目录或者/baskup目录,也可挂两个raid两个目录,然后全量脚本将备份备在此目录里。
5、中大型企业mysql备份如何实现
(1)全备+增备
(2)每周一次全备
(3)增备实现的两种方式
第一种:
通过定时任务+备份切割脚本(推送);每天0点,flush logs,
详解:执行脚本之前先flush logs一下,比如出现00008脚本,我们把1-7进行打包推送到备份服务器;
备份服务器设置两个模块,一个全备份模块,一个增备份模块;
备份思路:先把日志文件移走,移到一个备份目录里,然后打包推送,验证完整性,如果验证完整性失败就通知运维;推送完成后,第二天删除前一天的;
优点:如果想恢复到某个版本或某个位置,可轻松实现
缺点:硬盘成本非常高,有多余的冗余数据
第二种,不推送,实时同步rsync+inotify
每周日全量备份结束后,删除所有日志文件,进行一次flush logs
重新开始后,将所有mysql bin.*实时同步到备份服务器上。
优点:成本低,如果某一天数据库出问题,可恢复到出问题之前
缺点:无法恢复到某个位置或某一天
数据库常用的架构解析
a、主从同步,主从复制

                         实时同步
                          
                           binlog
将“主Mysql数据库”实时同步binlog日志到“从Mysql数据库”上,这样从Mysql读取日志文件,就与主数据库完全一致了;那么我们就可以把读请求转移到“从服务器上(IP2)”,把写请求指向“主服务器上(IP1)”
发展一段时间以后,有三台从服务器,两台供读,一台供备份(全备、增备)或者供开发数据分析和开发软件功能测试。
 
 
 
 
 
七、慢查询日志
记录所有执行时间超过long_query_time秒的SQL语句,可用于找到执行时间长的查询,以用于优化。默认未开启。
vim /etc/my.cnf
[mysqld]
long_query_time = 5   //单位秒
log-slow-queries = mysql_slow.log
/etc/init.d/mysqld restart    ==>重启慢日志
 
 
 
 
 
 
 
 

MySQL

标签:server   不能   完整性   实现   超过   cmak   阵列   数据表   value   

原文地址:https://www.cnblogs.com/kakajiang/p/10009775.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!