zoukankan      html  css  js  c++  java
  • MySQL数据库详解

    一、数据库概述
        1、数据库与文件系统文件系统对比。
            数据冗余和不一致性
            数据访问
            数据格式相对独立
            数据完整性和原子性
            数据的并发访问
            数据的安全性问题
        2、数据库概念
            1、DBMS:数据库管理系统
            2、数据模型
                层次模型:
                    按照层次结构的形式组织数据库的模型
                    IMS
                    缺点:大量的冗余数据
                网状模型:
                    按照网状结构的形式组织数据库数据的模型
                    DBTG
                    缺点:后期维护困难
                关系模型:
                    按照关系结构(行和列,表)的形式组织数据库数据的模型。
                    RDBMS    关系式数据库管理系统
            3、关系
                E-R模型
                实体:数据对象
                联系:一个或多个实体之间的联系关系
                属性:实体的某一个特性
            4、SQL类型
                DML:数据操作语言,操作数据库中的数据。如select update
                DDL:数据描述语言,用来建立数据库,定义数据关系。如create drop
                DCL:数据控制语言,用来控制数据库的权限组件。如grant revoke
            5、数据结构
                文件的逻辑关系:
                    上层:文件
                    中层:文件系统
                    下层:磁盘中的数据块
                数据库的逻辑关系:
                    上层:数据表(展现给用户的)
                    中层:存储引擎(数据库的组件)
                    下层:文件系统
            存储引擎:为存储数据、管理数据、查询数据所建立的数据库实现方法。
            6、事务和锁的概念
                事务:SQL语句的批处理。要么执行成功,要么保持原样。
                锁  :
                    表级锁:速度快、冲突多
                    行级锁:冲突少、速度慢
                    页级锁:折中方案(锁定相邻的多行)速度较快,冲突较少
                约束:
                    域约束:限制每个数据的类型
                    外键约束:
                    唯一性约束,主键约束。
            7、MySQL常用的存储引擎:
                MyISAM
                    MySQL诞生起默认的存储引擎
                    较高的插入、查询速度。
                    不支持事务,行级锁以及外键约束等功能。
                InnoDB
                    支持事务、行级锁、外键约束等功能。
                Memory
                    存在于内存中,通常使用hash存储数据,速度快。
            8、数据的存储和查询
                存储管理器(专用的存储组件,通过DDL来创建数据表结构,再通过DML来保存SQL语句的处理结果)
                    权限及完整性管理器
                    事务管理器
                    文件管理器
                    缓冲区管理器
                查询管理器(负责接收用户的查询请求,理解用户请求,并将结果交给存储管理器来真正实现数据管理)
                    DDL、DML解释器
                    查询执行引擎
            9、数据库的后台工作模式
                单进程多线程的工作模式
                1、守护线程
                2、应用线程
            10、数据库优化
                缓存
                    用户的请求不需要每次都消耗系统资源)
                线程重用
                    用户退出后不撤销线程,而是分配给其他用户使用。
                提升内存
            缺点:不支持海量数据,不支持SMP对称多处理器架构。
    二、MySQL的命令基础
        1、安装
            社区版
                GPL
            企业版
            
            集群版
            主配置文件:/etc/my.cf
                [mysqld]                            数据库主进程设置区
                datadir=/var/lib/mysql              数据存放目录
                socket=/var/lib/mysql/mysql.sock       套接字文件目录
                user=mysql                            指定运行用户
                symbolic-links=0                    是否允许软连接连接一些文件让系统来调用
                [mysqld_safe]                        启动设置区
                log-error=/var/log/mysqld.log        错误日志
                pid-file=/var/run/mysqld/mysqld.pid    进程id存放文件

        2、SQL语句
            管理:
                设置用户名密码
                    初次设置:mysqladmin -uroot password '密码'
                    更改    :mysqladmin -uroot password '密码' -p   需要输入原密码。
                登陆数据库:
                mysql -u root -h localhost -P 3306 -S /var/lib/mysql/mysql.sock -p
                    -u 指定用户
                    -h 指定数据库地址
                    -P 指定端口
                    -S 指定套接字文件
                    -p 输入用户名密码
                创建用户
                    create user 'zhuangsan'@'localhost' identified by '123456';  用户名zhangsan,只能本地登陆,密码123456
                    登陆地址:
                        localhost    本地登陆
                        IP地址        只能从指定IP地址登陆
                        %            除本地外的所有地址。
                更改密码
                    set password=password('123');    登陆用户更改自己的密码(所有用户都可以操作)
                    set password for 'zhuangsan'@'localhost'=password('123');    为zhangsan用户在本地登陆更改密码。(管理员操作)
                管理员用户忘记密码
                    更改数据配置文件/etc/my.cnf 在[mysqld]主配置设置区增加 skip-grant-tables
                    重启服务器    service mysqld restart
                    直接执行mysql不加用户名密码登陆。
                    更改root密码 update mysql.user set password=password('890') where user='root';
                    删除配置文件中添加的内容,重启服务,用新密码登陆。
                权限操作:
                    show grants for 'zhuangsan'@'localhost';    查看zhangsan用户在本地的权限
                    grant all on aa.* to zhangsan@'localhost' identified by '123';
                    revoke drop on aa.* from 'zhangsan'@'localhost';  删除drop权限
                        all表示所有权限
                        aa.*表示aa数据库下的所有表
                        zhangsan@'localhost'表示登陆方式
                        identified by '123'密码123
            数据操作
                增
                    create database aa; 创建数据库
                    mysql> create table a2(                                创建表a2
                        -> id int unsigned not null auto_increment,        字段名:id、数值类型:int、不允许为负数:unsigned、不允许为空:not null、自增:auto_increment
                        -> name char(20) not null default '',            字段名:name、数值类型:char(20)、不许为空、默认值空
                        -> age int not null default '0',                字段名:age、默认值:0
                        -> primary key (id));                            主键:id
                    insert into a2 (name,age) values ('zhuangsan','13');    为a2表插入记录
                    insert into a1 (id,name) select id,name from a2;        将a2中的id,name字段复制到a1表里面
                    
                
                删
                    drop database aa;    删除数据库,如果里面有表会一并删除。
                    delete from a2 where id=1;
                    delete from a2 where age between 20 30; 区间删除,删除a2表里age字段在20到30之间的记录。
                        between 值1 值2    匹配区域数据。
                
                改
                    update aa.a1 set name='lisi' where id=1;     将aa数据库里a1表的id字段等于1的记录里name字段更改为lisi
                    alter table a1 rename a3;    更改表名,将a2改为a3
                    alter table aa.a2 modify name char(30) not null default 'lisi';        更改字段属性
                    alter table aa.a2 change name username char(30) not null default 'lisi';    连着字段名一块更改,name改为username
                    alter table aa.a2 add time datetime;    添加一个字段,类型是datetime
                    alter table aa.a2 age int first;        表示记录,first表示添加到第一行。
                    alter table aa.a2 add age int after id;    在id字段之后添加一个字段。after表示添加到某条字段后。
                    alter table aa.a2 drop time;            删除字段
                查
                    show databases;        查看所有数据库
                    use 数据库;            选择需要操作的数据库    
                    show tables;        显示数据库中的数据表
                    describe a1;        查看表结构,或者简写成desc a1;也可。
                    select * from 表G;    显示表里的所有记录,G表示竖排显示。

    三、MySQL备份
        1、备份方案遵循
            数据库的失效次数减到最少
            数据库的恢复时间减到最少
            数据库失效后,确保尽可能少的数据丢失或根本不丢失
            总结:通过特定的方式,将数据库的必要文件复制到转储设备的过程。
        2、备份方式
            冷备份
            热备份
                快照备份,例如LVM写时复制(copy-on-write)
            逻辑备份
                提取数据中的所有记录
                mysqldump(主要的备份方式) 单线程,速度慢
            物理备份
                直接拷贝数据库文件和日志来完成备份,多线程、速度更快
            云备份
            异地备份
            高可用
            负载均衡
        3、mysqldump备份
            mysqldump -uroot -p aa > 1.sql        将aa数据库备份至1.sql文件
            mysqldump -uroot -p test a1 > 2.sql    将test库中的a1表备份至2.sql数据库
            mysqldump -uroot -p --databases aa bb  > 3.sql        同时将aa和bb数据库备份至3.sql文件,--databases参数表示后面空格隔开的都是数据库
            mysqldump -uroot -p --all-databases > 4.sql            --all-databases表示备份所有数据库
            mysql -uroot -p aa < 2.sql            将2.sql还原至aa数据库中(单个数据库或多个表还原时需要指定数据库)
            mysql -uroot -p < 3.sql                将多个数据库还原的时候不需要指定库名称。
        4、mysqlhotcopy备份
            mysqlhotcopy --flushlog -u='root' -p='890' --regexp=^a /backup/
                --flushlog    标准格式。表示通过日志进行备份
                -u:用户名    -p:密码    --regexp:要使用的正则表达式
                最后跟备份目录
            使用mysqlhotcopy备份是直接将数据目录下的数据拷贝过来
            还原的时候直接将备份的数据库cp到数据库目录
            文件格式:(每个数据表都保存成三个后缀名不同的文件)
                .frm    数据表格式
                .myd    数据表内容
                .myi    数据表索引
        mysqldump备份的文件是数据库端的sql语句集合,而mysqlhotcopy是快速文件意义上的COPY。速度上备份sql语句更快,mysqldump可以适用MYISQM和INNODB引擎,nysqkhotcopy只适用于MYISAM
        日志备份
          MySQL常见日志:
            错误日志
                log_error=路径
            查询日志/一般查询日志
                general_log=NO/OFF
                general_log_file=路径
                log=NO/OFF    全局日志打开开关
            慢查询日志
                slow_query_log=NO/OFF
                slow_query_log_file=路径
                long_query_time=时间
                log-slow-queries=路径    根据版本不同可能需要添加这一条
            二进制日志
                记录更改数据库状态的操作。
                log-bin=文件名
                mysqlbinlog mysql.bin.000001    查看二进制日志
            中继日志
                主从环境中,从服务器保存数据的日志文件relay-bin.000001
          查看日志信息:
            show global variables like "%log%";            显示所有日志开启状态
            show global variables like "%long_query%";  显示慢查询设置的时间
            show binary logs;        查看当前系统中正在使用的二进制文件
            show binlog events in 'mysql-bin.000001';    查看文件的详细信息
            show master status;        查看简要信息
          通过二进制日志进行备份和还原
            二进制日志管理工具:mysqlbinlog
            两种恢复方式:
                根据时间恢复数据:
                mysqlbinlog --start-datetime '2019-03-01 04:18:13' --stop-datetime '2019-03-01 04:19:07' mysql-bin.000002 | mysql -uroot -p
                    --start-datetime    选定日志的开始时间
                    --stop-datetime        选定日志的结束时间
                    | mysql -uroot -p    将截取的日志输出到数据库中
                根据数据大小恢复数据:
                mysqlbinlog --start-position=189  --stop-position=311 mysql-bin.000002 | mysql -uroot -p
                    --start-position    选定开始大小
                    --stop-position        选定结束大小
        多机备份:
            备份原理:
                从服务器通过读取主服务器的二进制日志文件来进行数据同步
            备份过程:
                当客户端对主服务器进行数据操作时,主服务器的I/O线程将操作写入二进制日志文件mysql-bin.000001中。
                主服务器给从服务器读取二进制日志文件的授权
                管理员通过change master to ...语句。将需要读取的操作写入master.info中
                从服务器的I/O线程根据master.info读取主服务器的二进制日志文件
                从服务器将读取的二进制日志文件写入本机的继日志文件relay-bin.000001中。
                从服务器的SQL线程读取中继日志,将SQL语句操作写入数据库中。完成备份
            
            主从配置:
                将数据单向备份至从服务器
              主
                配置文件my.cnf
                    log-bin=mysql-bin    开启二进制日志
                    server-id=205        server-id表示唯一标识符。
                授权
                    grant replication slave on *.* to 'zhangsan'@'10.248.24.206' identified by '123456';
                    flush privileges;    刷新权限列表,有些老版本更改权限后需要操作一下
              从
                配置文件my.cnf
                    log-bin=mysql-bin    开启二进制日志
                    server-id=206        server-id表示唯一标识符。
                读取信息:
                    change master to master_host='10.248.24.205',master_user='zhangsan',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=339;
                启用从服务器属性:
                    start slave;
                查看从服务器状态信息。    
                    show slave statusG;  保证两个YES,表示主从正常。
                        Slave_IO_Running: Yes
                        Slave_SQL_Running: Yes
            主主配置:
                将数据双向备份至对方主机。
                配置文件选项:
                    replicate-do-db=aa            只复制指定数据库
                    replicate-do-table=a1        只复制指定数据表
                    replicate-ignore-table=a1    复制时忽略指定数据表
                    binlog-do-db                只记录指定数据库的更新到二进制文件
                    binlog-do-table                只记录指定数据表的更新到二进制文件
                    binlog-ignore-db            忽略指定数据库的更新到二进制文件
                    auto-increment-increment=2    指定自增长的步长为2(用于避免主键冲突)
                    auto-increment-offset=1        指定起始值为1
                配置文件:
                    主:
                    log-bin=mysql-bin
                    server-id=205
                    replicate-do-db=test
                    binlog-ignore-db=mysql
                    binlog-ignore-db=information_schema
                    auto-increment-increment=2
                    auto-increment-offset=1
                    备:
                    log-bin=mysql-bin
                    server-id=206
                    replicate-do-db=test
                    binlog-ignore-db=mysql
                    binlog-ignore-db=information_schema
                    auto-increment-increment=2
                    auto-increment-offset=2
                配置方式:
                    先以第一台为主第二台为从进行授权配置。然后以第二台为主第一台为从进行授权配置。
            多主一从
                原理:主服务器正常设置,在从服务器上模拟多个mysql实例,每个实例当作一台从服务器对应主服务器。
                所用到的模块:mysqld_multi
            主服务器设置:略
            从服务器设置
                配置文件:
                    [mysqld_multi]                            建立模块区域
                    mysqld=/usr/bin/mysqld_safe                指定启动脚本路径
                    mysqladmin=/usr/bin/mysqladmin            指定更改密码脚本所在路径
                    log=/tmp/mysqld_multi.log                指定日志记录位置
                    
                    [mysqld1]                                创建数据库实例1(第几个实例就在mysqld后面加数字)
                    port=3306                                监听端口
                    datadir=/var/lib/mysqla/                数据目录
                    pid-file=/var/lib/mysqla/mysqld.pid        pid文件
                    socket=/var/lib/mysqla/mysql.sock        套接字文件
                    user=mysql                                指定运行用户
                    server-id=207
                    
                    [mysqld2]                                创建数据库实例2
                    port=3307
                    datadir=/var/lib/mysqlb/
                    pid-file=/var/lib/mysqlb/mysqld.pid
                    socket=/var/lib/mysqlb/mysql.sock
                    user=mysql
                    server-id=207
                    
                初始化MySQL进程,生成数据目录
                    mysql_install_db --datadir=/var/lib/mysqla/ --user=mysql
                    mysql_install_db --datadir=/var/lib/mysqlb/ --user=mysql
                    
                更改数据目录属主
                    chown -R mysql /var/lib/mysqla/
                    chown -R mysql /var/lib/mysqlb/
                    
                启动数据库实例
                    mysqld_multi --defaults-file=/etc/my.cnf start 1
                    mysqld_multi --defaults-file=/etc/my.cnf start 2

                登陆实例1并设置从服务器属性
                    mysql -P 3306 -S /var/lib/mysqla/mysql.sock
                    change master to master_host='10.248.24.205',master_user='zhangsan',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=336;
                    start slave;
                    show slave statusG
                    
                登陆实例2并设置从服务器属性
                    mysql -P 3307 -S /var/lib/mysqlb/mysql.sock
                    change master to master_host='10.248.24.206',master_user='zhangsan',master_password='456',master_log_file='mysql-bin.000001',master_log_pos=336;
                    start slave;
                    show slave statusG
        
    三、MySQL读写分离
        将服务器事务性查询交由主服务器处理,将服务器select类查询交由从服务器处理。适用于读取操作远大于写操作的场景
        提升性能的原因:
            1、物理服务器数量增加、提升负荷
            2、主从服务器架构,减少了数据库锁的消耗
            3、提升从服务器性能(MYISAM)
            4、数据写入的性能提升
            5、减少网络阻塞
            6、分摊读取
            7、增加冗余
        所用中间件:
            Mysql proxy
        读写分离搭建
            搭建主从环境:略
            配置Java环境
                mkdir /amoeba
                tar -zxf jdk-7u40-linux-x64.gz
                ln -s jdk1.7.0_40/ /amoeba/jdk
                vim /etc/profile
                    JAVA_HOME=/amoeba/jdk
                    export JAVA_HOME

                    PATH=$JAVA_HOME/bin:$PATH
                    export PATH

                    CLASSPATH=.:$JAVA_HMOE/bin/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
                    export CLASSPATH
                source /etc/profile        加载一下
                java -version            测试Java环境配置
            安装amoeba
                unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba        解压amoeba到指定路径
                chmod -R +x /usr/local/amoeba/bin/        给amoeba的bin目录执行权限
            配置amoeba
            vim /usr/local/amoeba/conf/amoeba.xml    更改amoeba主配置文件(配置文件是默认的根据具体需要更改)
                <server>        server区域时amoeba的参数配置区域
                    <property name="port">8066</property>        默认端口
                    <property name="ipAddress">10.248.24.207</property>        amoeba的地址
                    <property name="user">root</property>            登陆用户
                    <property name="password">963</property>        登陆密码
                </server>
                <dbServerList>    数据库列表配置区域
                    <dbServer name="server1">    单台数据库配置区域,如果有多台,可以复制粘贴此区域    
                            <property name="port">3306</property>        数据库端口
                            <property name="ipAddress">10.248.24.205</property>        数据库地址
                            <property name="schema">test</property>        要操作的数据库名,要操作多台库,复制粘贴多台。
                            <property name="user">zhangsan</property>    登陆数据库所用的用户名
                            <property name="password">123</property>    登陆数据库所用的密码
                    </dbServer>
                    <dbServer name="master" virtual="true">            master数据库池(用于写入操作),单台数据库要加到数据库池里,可以配置集群访问方式
                        <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                            <property name="poolNames">server1</property>    加入的数据库,多台以分号隔开
                        </poolConfig>
                    </dbServer>
                    <dbServer name="server2">                        
                            <property name="port">3306</property>
                            <property name="ipAddress">10.248.24.206</property>
                            <property name="schema">test</property>
                            <property name="user">zhangsan</property>
                            <property name="password">456</property>
                    </dbServer>
                    <dbServer name="slave" virtual="true">            slave数据库池(用于读取操作)
                        <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
                            <property name="poolNames">server2</property>
                        </poolConfig>
                    </dbServer>
                </dbServerList>
                
                <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
                    <property name="defaultPool">server1</property>        默认操作server1
                    <property name="writePool">master</property>        写入数据操作master数据库池
                    <property name="readPool">slave</property>            读取数据操作slave数据库池
                </queryRouter>
            更改amoeba启动脚本
                vim ./bin/amoeba
                     DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"        将最后的值改为256,要不然显示有问题。
            启动amoeba
                nohup bash -x /usr/local/amoeba/bin/amoeba &        
                netstat    -antp | grep 8066    查看端口是否起来
                ps aux 查看有没有amoeba进程
            登陆amoeba代理
                mysql -uroot -h 10.248.24.207 -P 8066 -p

  • 相关阅读:
    服务器电源管理(Power Management States)
    MSSQLSERVER数据库- 杂记
    MSSQLSERVER数据库- 判断全局临时表是否存在
    MSSQLSERVER数据库- 获取月份的第一天和最后一天
    JQuery- 解析JSON数据
    恼人的Visual Studio 2010崩溃重启问题
    MSSQLSERVER数据库- 游标
    Js/Jquery- Base64和UrlEncode编码解码
    MSSQLSERVER数据库- 解决不允许保存更改表结构
    Java- Jdbc学习
  • 原文地址:https://www.cnblogs.com/lingshu/p/10500399.html
Copyright © 2011-2022 走看看