zoukankan      html  css  js  c++  java
  • MySQL

    一、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.userG   把横着的数据自动换行(变竖着显示)
    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    ==>重启慢日志
     
     
     
     
     
     
     
     
  • 相关阅读:
    Map集合的四种遍历
    java 请求 google translate
    Linux 内核初级管理
    Linux GRUB
    Linux 系统启动流程
    Linux 任务计划 crontab
    Linux 进程管理工具
    Linux sudo实作
    Linux 进程管理
    Linux 网络配置命令:ip、ss
  • 原文地址:https://www.cnblogs.com/kakajiang/p/10009775.html
Copyright © 2011-2022 走看看