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

MySQL 基础知识

时间:2015-02-11 18:51:32      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:基础知识   mysql   

http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/       MYSQL手册

mysql>? show                //所有命令的说明帮助信息

SHOW CHARACTER SET [like_or_where] 
SHOW COLLATION [like_or_where] 
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where] 
SHOW CREATE DATABASE db_name 
SHOW CREATE FUNCTION func_name 
SHOW CREATE PROCEDURE proc_name 
SHOW CREATE TABLE tbl_name 
SHOW DATABASES [like_or_where] 
SHOW ENGINE engine_name {LOGS | STATUS } 
SHOW [STORAGE] ENGINES 
SHOW ERRORS [LIMIT [offset,] row_count] 
SHOW FUNCTION CODE func_name 
SHOW FUNCTION STATUS [like_or_where] 
SHOW GRANTS FOR user 
SHOW INDEX FROM tbl_name [FROM db_name] 
SHOW INNODB STATUS 
SHOW PROCEDURE CODE proc_name 
SHOW PROCEDURE STATUS [like_or_where] 
SHOW [BDB] LOGS 
SHOW MUTEX STATUS 
SHOW OPEN TABLES [FROM db_name] [like_or_where] 
SHOW PRIVILEGES 
SHOW [FULL] PROCESSLIST 
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n] 
SHOW PROFILES 
SHOW [GLOBAL | SESSION] STATUS [like_or_where] 
SHOW TABLE STATUS [FROM db_name] [like_or_where] 
SHOW TABLES [FROM db_name] [like_or_where] 
SHOW TRIGGERS [FROM db_name] [like_or_where] 
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where] 
SHOW WARNINGS [LIMIT [offset,] row_count]

1.用yum安装mysql时如何选择安装路径,默认安装在哪个路径下?

    先用rpm -qa *mysql*看看你安装了哪些包,然后用 rpm -ql xxxxxxx 去查看具体的包安装位置
    主要安装涉及到的目录有 /usr/bin;/usr/share;/var/log

2.Mysql数据库的主要配置文件有哪些?

    主要的配置文件是/etc/my.cnf  

    此文件中指定了数据库的存放位置   #   datadir=/var/lib/mysql

3.数据库文件存放在哪个路径下?

    默认存放在    datadir=/var/lib/mysql

    默认在:/var/lib/mysql/ 按目录存放

    1.关闭mysql

    2.移动/var/lib/mysql/目录下的数据库目录到自定义目录,如:/home/mysql_datas

        原数据库目录结构

               比如/var/lib/mysql/mysql

                      /var/lib/mysql/business

                      /var/lib/mysql/upper等

        移动后结构

               比如/home/mysql_datas/mysql

                      /home/mysql_datas/business

                      /home/mysql_datas/upper等

    3.修改/etc/my.cnf中的如下两项到新目录的位置

       datadir=/home/mysql_datas

    4.修改mysql启动脚本中上面两项的位置

          #vi /etc/rc.d/init.d/mysqld

         get_mysql_option mysqld datadir "/var/lib/mysql"改为

          get_mysql_option mysqld datadir "/home/mysql_datas/mysql"

    5.启动mysql

 mysql>\.         //source (\.) Execute an SQL script file. Takes a file name as an argument.   执行SQL脚本

自动递增:    id int primary key auto_increment;

windows 系统下mysql的配置:

mysql 的默认端口3306

mysql客户端连接成功后,如果要执行系统命令,可以加system+系统命令

4.安装完成后配置环境变量:

     找到安装目录中D:\xxxxxxxx\bin  添加到系统的环境变量中

5.启动 和关闭  :

     net stop mysql(服务名) ; net start mysql (服务名)  ;系统服务进程

6.连接mysql:

     mysql -uroot -p123456 -h hostname/IP 

7.查看mysql的基本信息

    mysql>show databases;    //查看所有数据库

    mysql>show status;    //查看运行状态 

    mysql>show tables;    //查看某个数据库中的表

    mysql>use mysql;    //使用某个数据库

    mysql>select version();    //查看数据库版本

    mysql>select current_date;    //查看当前日期

    mysql>select now();    //查看当前时间点

    mysql>select user();    //查看当前登录的用户

    mysql>select database();  select schema();  //查看当前数据库

    mysql> desc user;    //显示出表user的具体字段内容

    mysql> flush privileges;    //更新表权限后,执行使命令生效

    mysql>show processlist;    //查看当前用户的连接信息

    mysql>select user();select current_user();select system_user();select session_user();    //查看当前用户

    mysql>select password(str);select md5(str);    //加密不可逆

    mysql>select encode(str,pswd_str);    //加密可逆

    mysql>select decode(crypt_str,pswd_str);    //解密函数

    mysql>show grants;    //    查看当前用户的权限信息

    mysql>show grants for user@‘hostname‘;    //查看指定用户的权限信息

    mysql>set password for root@localhost=password(‘在这里填入root密码‘);  ← 设置root密码

    mysql>update user set password=md5(‘wangdong‘) where user=‘wangdong‘;  //为某个用户设定加密的

        注:在向数据库中user表添加账号,用于管理数据库时,使用insert 语句添加用户时,指定的密码被系统用password加密方式加密

                如果insert语句中,password=‘1234‘,实际的是1234是加密后的密码,当登录输入1234密码时,提示密码错误。故建议不要通过

                insert语句向user 表中添加用户,如果使用insert添加,请先使用select password(‘wangdong‘);把明文密钥‘wangdong‘,经过加密

                后产生的字符串,填写到insert语句中的password字段。

                建议使用 create table user ‘wangdong‘@‘127.0.0.1‘=password(‘wangdong‘); //明文就是wangdong,保存到user表中的加密后的

                字符串。

                mysql数据库默认是通过password加密方式对用户的明文密码进行加密

    数据库默认的三个数据库作用:

               第一个个数据库INFORMATION_SCHEMA:是信息数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息

            第二个数据库mysql:这个是mysql的核心数据库,类似于sql server中的master表,主要负责存储数据库的用户、

                                        权限设置、关键字等mysql自己需要使用的控制和管理信息。不可以删除,

                                        如果对mysql不是很了解,也不要轻易修改这个数据库里面的表信息。

            第三个数据库test:这个是安装时候创建的一个测试数据库,和它的名字一样,是一个完全的空数据库,没有任何表,可以删除。

8.mysql的Notifier 是对mysql服务器的监控工具

9.mysql 管理工具:

    mysql;Navicat;MySQL-Front;phpmyadmin;MySQL Workbench;mysql-administrator;

10.mysql 存储引擎

    mysql> show engines;    //查看数据所有的存储引擎

    mysql>show variables like ‘%storage%‘;     //查看当前的存储引擎

    mysql>show create table user\G;     //查看表的创建过程,以及创建表所用的存储引擎

    mysql> create table test02 (id int) engine=INNODB;    //创建表时指定存储引擎

    web、数据仓库应用环境下最常使用的存储引擎是myisam,较高的插入、查询、但不支持事务

    archive 引擎支持insert ,select 不支持delete,update ,replace 常用于日志文件的存储     文件格式 *.ARZ

    my.ini是window下mysql的配置文件,my.cnf是linux下mysql的配置文件

    myisam 和innodb的区别:

        MYISAM不支持外键和事务;innodb 支持外键和事务;数据存储方式不同,myisam建一张表对于三个文件,innodb建一张表对于一个文件.frm

        myisam存储引擎:

            不支持外键和事务,mysql的默认存储引擎;myisam建一张表对于三个文件,*.frm ,*.myd,*myi;数据文件和索引文件可以放置在不同的文件

            中,在建表的时候通过data directory和index directory定义存储位置;

            myisam引擎提供对表的修复工具,check table name 检测表;repair table name 修复表

            myisam 表支持3种不同的存储格式:动态表,静态表,压缩表

                            静态表示默认的存储格式,占据定长的列空间;动态表中包含变长字段,占有的空间少,但是易产生碎片,optimize优化

                            压缩表有myisampack工具创建,占据的空间很小

        innodb 存储引擎:

            支持事务,外键;数据存储一个文件中*.frm;写效率没有myisam引擎好,占据的空间会大用于存放索引和数据;

            innodb 支持外键,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候才会自动创建索引

            创建索引的时候,可以指定在删除,更新父表时,对子表进行的操作有restrict,cascade,set null, no action;restrict和no action相同是

            子表有相应变化时,父表不变化;cascade 表示父表的更新和删除时,子表也做相应的更新和删除;set null表示父表更新或者删除时,子

            表中对于的字段被设为null;

                    例:constraint ‘fk_city_country‘    foreign key (country_id) references country (country_id) on delete restict on update cascade

            当某个表被其他表创建了外键参考,该表对应的索引和主键禁止修改。

            关闭外键约束 set foreign_key_checks=0    (=1 开启)

            查看外键信息 show table status    //show table status like ‘teacher‘\G

            innodb 存储方式:共享表空间存储;多表空间存储

        memory 存储引擎:

            表存放的内存中,速度很快,但是关机后数据会丢失,默认使用hash 算法;每个memory表对于一个磁盘文件*.frm

            为memory表创建索引的时候可以指定使用hash 索引,还是使用btree索引;

            在启动mysql是可以使用--init-file选项,把insert..into和load data infile 这样的语句放在这个文件中,就可以在系统启动的时候从持久固定

            的源装载表;

            每个memory 表中可以存放的数据量的大小受    max_heap_table_size的限制,默认16M,可以在建表时用max_rows指定最大行数

        merge存储引擎:

            merge 是一组myisam表的组合,merge表本身没有数据,对merge类型的表的操作实际内部是对myisam表的操作;

            对merge类型表的drop,只是删除了merge的定义对内部的数据并没有变动;

            一个merge表有*.frm和*.mrg两个文件;*.mrg文件存放组合表的信息

            对merge类型的表的插入操作,是通过使用insert_method=first|last|no (第一个表,第二个表,不能插入)

                            例:engine=merge union=(表1,表2.....) insert_method=last;        

            

11.mysql的数据类型

    数值类型

        整数: tinyint 1字节    tinyint(M) unsigned zerofill M:宽度  unsigned:无符号类型 zerofill:0填充 

                    smallint 2字节;mediumint  3字节;int 4字节;bigint 8字节

        小数:float 4字节;double 8字节;decimal 浮点和定点类型都可以用(M,N)表示,M表示总的位数,N表示小数的位数

    日期/时间类型

        year    YYYY    1字节;1901-2155[0000,表示错误时间]

                输入2位,‘00-69‘表示2000-2069; ‘70-99‘ 表示 1970-1999;

        time    HH:MM:SS    3字节;date    YYYY-MM-DD    3字节;

        datetime    YYYY-MM-DD HH:MM:SS 4字节 ;

        timestamp   YYYY-MM-DD-HH-MM-SS 8字节; 实际开发中使用时间戳来精确到秒的列

        timestamp支持的范围小1970010108001到2038年的某个时刻;datetime 范围1000-01-01 00:00:00到9999-12-31范围大

        timestamp可以根据时区的影响,能准确反映出当地的时间;datetime不会根据时区的影响,时区不同,时间不同,有误差;

    字符串类型

        char    固定长度 ; char(M) 存储内容不足M个时,后面用空格填补。

        varchar可变长度;binary;varbinary;blob;text;enum枚举类型;set

        char和varchar型的选择原则:1.空间利用率2.速度

        text 文本类型,大文本,没有默认值

        检索时char 删除了尾部的空格,varvhar保留了尾部的空格

        enum(‘M‘,‘F‘)枚举类型

        set是和enum很类似,也是一个字符串对象,可以存储0-64个成员,1-8个字节;set 类型可以一次选择多个成员,而enum只能

        选择一个成员;对于输入的值在set范围内的,都可以正确地注入到set类型的列中,超出范围的,不写入,重复的只取一次

    运算符

        算术    + - * / (除,返回商)%(模,返回余数);如果除数为0,返回null;

        比较    > < = >= <= != <>;

        逻辑     非! ;于and &&; 或 || or;异或 xor;

        位    & | ~^ <<    >>

        is null 判定是否为空

        is not null 判定是否不为空

        isnull

12.mysql 常用函数

    /**************字符串函数*********************/

select insert(‘ring‘,2,0,‘ok‘); /*从2的地方插入ok字符,插入时替换0个字符*/
select repeat(‘ring‘,2); /*重复输出字符串2次*/
select REVERSE(‘ring‘); /*反写*/
select mid(‘ring‘,2,2);/*从某个位置取某个长度的字符*/
select instr(‘ring‘,‘i‘);/*查找字符*/
select replace(‘very good‘,‘o‘,‘O‘); /*替换所有的字符*/
select LENGTH(‘very good‘); /*返回字符串长度*/
select ascii(‘abc‘);/*返回最左边的字符ascii码*/
select space(3);/*产生3次空格*/
select CONCAT(‘ri‘,‘n‘,‘g‘,‘ wang‘); /*组合成字符串*/
select lcase(‘RING‘); /*小写*/
select ucase(‘ring‘); /*转换成大写*/
select substring_index(user(),‘@‘,1); /*提取当前的用户名,表示提取@左边第一出现的字符,如果后面的为负数则提取右边的字符*/

/**********************数学函数******************/
select conv(‘ee‘,16,10); /*将‘ee‘从16转换成10,16和10可以是任意进制*/
select bin(10); /*2进制*/
select hex(10); /*16进制*/
select oct(10); /*10进制*/
select round(12.5678,2); /*将小数保留两位,四舍五入*/
select round(123.8767); /*转换为整形,因为没有小数位*/
select char(65,66,99); /*将ascill码组合成字符串*/
select least(3,6,5,1); /*最小数字*/
select greatest(6,3,2,8,3,1);  /*最大数字*/
select power(2,3); /*2的3次幂*/
select sqrt(9); /*开方*/
select pi(); /*圆周率 */
select RAND(11); /*返回0-1的随机数,指定种子,每次的数都一样*/
select rand();  /*没有指定种子,默认为时间为种子*/

/********日期时间函数*****************/
select now();
select to_days(‘2008-07-6‘); /*转换成天数*/
select to_days(‘2008-8-8‘)-to_days(now());/*相差的天数*/
select day(now());/*该日期中的时,分,秒,天,月,年 hour(),minute(),second(),month(),year()*/
select dayofyear(‘2008-2-2‘); /*返回该年已过的天数*/
select monthname(now()); /*返回月的英文名*/
select dayname(now());/*星期几的英文名*/
select week(now(),0); /*表示当前的日期是第几周,后面的数字0表示从周日开始算,1表示从周一开始算*/
select from_days(734215); /*返回该天数表示的日期*/
select DATEDIFF(now(),‘2008-8-8‘); /*前面的日期减去后面的日期所得的天数*/
select date_add(now(),interval 2 day); /*表示给当前的日期加2天*/
select date_add(now(),interval 2 month); /*表示给当前的日期加2个月*/
select CURRENT_DATE(); /*当前日期,短格式*/
select CURRENT_TIME();/*当前的时间*/
select current_user();/*当前的用户*/
select date_format(now(),‘%Y-%m-%d %H:%i:%s‘);/*日期的格式,Y表示4位,H表示24小时制*/
select date_format(now(),‘%T‘); /*只显示时间,没有日期,T表示24小时制,r表示12小时制*/
select date_format(‘2008-08-08 14:08:08‘,‘%Y-%m-%d‘); /*显示日期部分,时间不要*/
select date_format(now(),‘%Y-%m-%d %H:%i:%s %W‘); /*带日期的*/
select date_format(‘2008-8-8‘,‘%W‘);/*该日期的星期几*/

/***********其他函数****************/
select database();/*返回当前的数据库名字*/
select substring_index(CURRENT_USER(),‘@‘,1);/*提取当前的用户名*/
select password(‘123‘); /*mysql的加密方式*/
select MD5(‘123‘);/*32位的md5加密*/
select LAST_INSERT_ID();/*返回最后一次自动产生的ID值*/
select format(123456789.565378,4);/*输出123,456,789.5654有四舍五入*/

/***************控制流函数*************/
select if(1,2,3);/*如果第一参数为空则输入第三参数,否则输入第二个参数,后面的参数可以是字符,第一为整形*/
select ifnull(null,2); /*如果第一参数为空则输出第二个参数,否则输出第一参数*/

select 
       name,
       case 
       when age<=20 then ‘年轻‘
       when age<=40 then ‘壮年‘
       when age<=50 then ‘中年‘
       else ‘老年‘
       end as ‘agestr‘,
       date_format(adddate,‘%Y-%m-%d‘) as ‘adddate‘
 from users; /*case 语句的用法*/

13.mysql账户命名规则

    mysql> create user ‘mysql‘@‘CentOS‘ identified by ‘‘;    //创建mysql 账号,指定可以从CentOS主机登录,密码为空,来管理数据库

14.mysql系统权限

    mysql> revoke select on mysql.* from ‘mysqladmin‘@‘127.0.0.1‘;    //    回收权限给用户

    mysql> grant select on mysql.* to ‘mysqladmin‘@‘127.0.0.1‘;   //分配权限给用户     

15.mysql的访问控制

    连接控制是根据mysql数据中的user表中的user,host,password三个参数去判断的;

    通过yum 安装完mysql后,默认是没启动的,需要执行下列命令进行启动

     chkconfig --list | grep -i mysqld //检测mysql服务是否启动

     chkconfig mysqld on //开启mysql服务

     service mysqld start //启动mysqld服务

    解决1045,1044问题

        1.停用mysql服务:# /etc/rc.d/init.d/mysqld stop

        2.输入命令:# mysqld_safe --user=mysql --skip-grant-tables --skip-networking & //跳过用户权限检查表,可以用于破解用户密码

        3.登入数据库:# mysql -u root

        4.mysql> use mysql;

        5.修改mysql数据库下的user表信息

         select user,host from mysql.user; //查询表中的信息

         update 相应的用户信息

        6.flush privileges

16.基本知识

    mysql> show variables like "character%";    //查看默认编码格式

    mysql>rename table oldname to newname    //更改表名

    mysql>desc user;    //查看表结构


    create table msg(

    id int,

    title varchar(60),

    name varchar(10),

    content varchar(1000)

    );


    create table goods(

    name varchar(10) not null default ‘‘,

    price float(5,2) not null default 0.00

)

  增

insert into msg 

values(3,‘初来‘,‘张三‘,‘测试使用‘);

更新

update msg set id=2 where set=1;

update msg set title=‘你好‘, name=‘李四‘, content=‘测试‘ where id=1;

update msg set id=2 where name=‘张三‘

delete from msg where id=3;

查询

select * from msg;

增加一列

alter table msg add address varchar(10);

列的默认值

Not null default 0;


create table info

(

id int primary key auto_increment,

name char(4) not null,

sex enum(‘男‘,‘女‘) default ‘男‘,

age tinyint,

email varchar(30),

telephone char(11),

note varchar(100),

salary double,

goschool date

)

insert into info values(‘‘,‘王东‘,‘男‘,‘25‘,‘111@qq.com‘,‘123456‘,‘河南人‘,‘1000.123‘,‘2014-05-08‘)

insert into info values(‘王东冬‘,‘男‘,‘25‘,‘111@qq.com‘,‘123456‘,‘河南人‘,‘1000.123‘,‘2014-05-08‘)

insert into info (name,sex) values(‘王五‘,‘男‘);

insert into info (name,sex) values(‘李海‘,‘女‘);


查询的5种子句:where,group,having,order by,limit

select语句

    消除重复的行,使用关键字

where

        in 表示在某个范围内,任意一个都可以

        between......and  在两个值区间

        not in 取出不再某个范围内的

        模糊查询 like  % 统配任意字符,_ 统配单个字符

group by 分组 主要用于统计数据,要结合统计函数使用才体现出具体意义;把具有相同属性的归为一组,然后再统计比较这个组中特定选项

        avg()    平均值;sum()    总和;count()    数量;max()    最大值;min()    最小值;

        select count(*) from goods;  //统计表中有多少行

        select name,count(*) as count from goods group by name;   // as 取别名

having 是对查询结果的列进行筛选,where查询是对数据表中具体的列进行数据查询        

order by  排序,可以升序排asc,也可以降序排desc,默认升序排列

        order by 可以按照多个列进行比较,order by 列1[desc/asc],列2[desc/asc]

        limit 在语句最后,起到限制条目的作用    limit [offset],N    //偏移量

        select * from goods order by price limit 3,2;    //排除前3,取从第三开始的第四,第五两行   

当多个子句一起使用时,书写的顺序要按照where ,group by ,having,order by ,limit 

子查询:

    where型

         把内层查询的结果作为外层查询的条件  

    from型

        把内层查询的结果当作临时表,供外层sql再次查询,内层的查询结果看出临时表,加"as 临时表名"

    exists型

        把外层查询结果拿到内层,然后查看内存查询是否成立

union的用法:合并查询的结果;

    要求:两次查询的列数一致,可以来自多张表;查询的列中,如果多个表中的列数据相同,默认情况下去重复,union all 显示重复

    子句中有order by ,limit,须加();子句中order by 须结合limit使用,单独使用没有意义

左连接、右连接、内连接

    左连接语法格式:select 列1,列2,..... from tableA  left join tableB on A.列=B.列 (此时就把A,B两个表整合成一个大表)

    右连接语法格式:select 列1,列2,..... from tableA  right join tableB on A.列=B.列 (此时就把A,B两个表整合成一个大表)

     内连接语法格式:select 列1,列2,..... from tableA  inner join tableB on A.列=B.列 (此时就把A,B两个表整合成一个大表)

    注释:左连接以左表为准,去右表匹配数据,找不到匹配,用null补齐

                左右连接可以相互转换,推荐以左连接代替右连接

                内连接是筛选出左右表中都有的数据,既左连接和右连接的交集数据

                同一张表多次被连接时,可以通过as取别名进行区别     A left join B as B01 on A.ID=B.ID lift jion B as B02 on ......

表的列之修改

    增列     

            alter table 表名 add 新列声明    //新增的列默认在最后一列,使用after 来修改新增的列位于哪个位置

            alter table 表名 add 新列声明 after 旧列   //alter table goods add test01 varchar(21) after name;

            alter table 表名 add 新列声明 first    //把新增列置于第一列

    修列

            alter table 表名 change 被修改的列名 新列的声明    //alter table goods change test01 test char(10);

            alter table 表名 modify 列声明   //alter table info modify note text;

            change 和modify都能修改列的属性,不同的是change可以修改列的名字,而modify仅用与修改列的类型

            alter table pro engine =innodb;    //修改表的存储引擎的类型

    删列

            alter table 表名 drop 列名    //alter table goods drop test;

    修改表名

            alter table oldname rename newname    //alter table info rename infomation;

    

视图

    视图是由查询结果形成的一张虚拟表,仅是为了提高查询速度而已,把某些查询结果保存起来,方便以后的查询

    create view 视图名 as select 语句

    删除视图: drop 视图名

    视图优点:1.简化查询  2.权限管理,可以隐藏某些列,不让别人查看3.拆分大数据表  结合模%

    修改视图: alter view 视图名 as select ....... (不如直接删除重建)

    注:视图是表的查询结果,自然表的数据改变了,定影响视图的数据;视图的数据改变了会影响到表的数据,但是并不总能影响表的数据,只有在          视图的数据和表数据一一对应时,视图中数据的改变才会影响到表中的数据

    视图的algorithm   

        merge:默认是该算法,是把创建视图时的select 语句where 条件和使用视图查询时的where条件进行合并组成一个条件查询相应的原始表

        temptable: 是在创建视图时瞬间创建一个临时表,查询视图中的数据就是去查询这张临时表中的数据

            //create algorithm=temptable view 视图名 as select 语句

字符集与校对集

    MySQL字符集的设定:服务器字符集;数据库字符集;表字符集;某一个没有设定字符集,就继承上一级的字符集;

    字符集转换过程:client---->字符集转换器----->服务器

        1.client 告诉服务器我传送给你的数据是什么编码?character_set_client

        2.告诉转换器转换成什么编码?character_set_connection

        3.服务器把查询结果反馈给client时,查询结果用什么编码?character_set_results

        注:如果1,2,3,采用相同的编码N,可简写为set names 编码N

总结:

create [algorithm=merge|temptable|unfined] view viewname as select *......

merge:

视图<----sql1,where id>10;

查视图<---sql2,where id <20;

形成sql:where id>10 and id<20 --查询-->基表

temptable:

视图<----sql1,where id>10;

查视图<---sql2,where id <20;

sql2---->[临时表]<---sql1<---基表

字符集

客户端---->转换器---->服务器

客户端<-----

客户端使用的字符集: set character_set_client = gbk/utf8

转换器转换后的字符集:set character_set_connection=gbk/utf8

返回给客户端的字符集:set chatacter_set_results=gbk/utf8

触发器  trigger  

作用:监视某种情况并触发某种操作

触发器可以监视增、删、改、触发操作增、删、改

触发器语句4个关键点:地点(表)-->监视事件(insert/update/delete)-->触发时间(after/before)-->触发事件(insert/update/delete)

    create trigger triggername

    after/before insert/update/delete on 表名

    for each row  //此句话被数据库系统写死

    begin

    SQL触发语句

    end;     //创建触发器时,由于MYSQL数据库默认的SQL语句是遇到分号(;)表示语句执行完毕,而end后也有分号,所有在创建触发器时需要更改默认的语句结束符     delimite @

    如何在触发器中引用行的值?

        对于insert而已,新增的行用 new 表示;应用新行种的列用  New.列名 表示   delete old.列名

    删除触发器  drop trigger triggername;

    create table pro(

    pid int not null primary key    auto_increment,

    name varchar(5),

    number int);

insert into pro(name,number) values(‘a‘,10),(‘b‘,20),(‘c‘,15);

    create table sal(

    sid int not null primary key auto_increment,

    name varchar(5),

    number int);

create trigger test

after insert on sal

for each row

begin

update pro set number=number-new.number where name=new.name@

end;

存储引擎和事务

    数据库对同样的数据,有不同的存储方式和管理方式,在mysql中被称作存储引擎

数据库优化

    1.数据库的设计(表的设计)   

            要符合三范式 3NF:

                1NF:原子性,不可分割

                2NF:满足1NF的基础上,满足2NF。表中记录要唯一,不能出现完全相同的记录。即实体唯一性

                3NF:字段冗余性约束,任何字段不能由其他字段派生出来,字段没有冗余。

        注:生产环境中,逻辑设计满足范式,物理设计可以降低范式要求(增加字段的部分冗余);逆范式1-n,最好把冗余归于1(少)的一侧;

    2.SQL查询语句优化

           1. 通过show status命令查看个SQL语句的执行频率;

                   show status 命令可以显示你的mysql数据库的当前状态,主要查看的是“com”开头的指令

                    show status like ‘com%‘  = show session status like ‘com%‘  //显示当前控制台的情况

                    show global status like ‘com%‘;  //显示数据库从启动到当前的情况

                    show global status like "com_select"; 

                    show status like "uptime";    //数据库从启动到当前的运行时间

                    show status like "connections";    //数据库从启动到当前的并发连接数

                    show status like "slow_queries";    //显示查询速度慢的语句(默认小于10秒)

            2.定位执行效率低的SQL语句(重点select)

                    存储引擎是myisam的,当创建一个表后,生产的三个文件 *.frm 表结构;*.myd 数据;*.myi 这个是索引;

                    找到慢查询的selec,mysql数据库支持把慢查询的语句记录到日志中,程序员分析。(默认情况下不启动)

                        [root@CentOS mysql]# service mysqld start --slow-query-log  //开启慢查询日记记录

                        mysql> set long_query_time=1;    //设置服务器的慢查询限定时间 1秒,超出1秒定位慢查询,并记录到日志中

                        mysql> show status like "slow%";    //查询服务器中出现的慢查询语句

                        通过日志定位出慢查询的语句后,可以通过建立索引来加快查询速度。但是索引的缺点是,查询速度增加了,增,删、改

                        速度相当慢了,*.myi文件占据的空间有大了

            3.通过explain分析低效率的SQL语句的执行情况

                        在执行某条SQL语句前通过explain分析改语句的执行效率情况;根据返回的信息可以看出SQL语句是否使用索引,是从多少条

                        记录中把数据取出的,以及排序的方式;

                        explain 语法中的字段:type 类型,all,system,const 一条记录//type类型的不同可以判断出语句的执行扫描范围

                                                             possible_keys: PRIMARY  //可能用到的索引

                                                             row: 1  //表示从多少数据中查询

                                                             extra:    //查询详细信息

                        explain select * from goods where id=10\G;   //执行分析

    

            4.确定问题并采取相应的优化措施

    SQL语句有几类:

        ddl(数据定义语言)[create alter drop]

        dml(数据操作语言)[select update insert delete]  

        dtl(数据事务语句)[commit rollback savepoint]

        dcl(数据控制语言)[grant revoke]

    3.数据库的配置

    4.硬件环境配置

索引

索引建立的适合情况:1.较为频繁地作为查询条件的列 2.经常改动的列不适合做索引 3.不作为where查询条件的列

索引的类型:查询某个表中有多少索引(show index from 表名)

       主键索引:把某列设为主键,即就是主键索引 (primary key)

       唯一索引:unique

       普通索引:index  

       全文索引:fulltext(仅MYISAM存储引擎支持)

       复合索引:多列合在一起构成复合索引

    索引的操作:

        索引的创建:

        1.如果创建unique /fulltext /普通索引有两种方式

                1.create [unique | fulltext] index 索引名 on 表名 (列1,列2,.......)

                2.alter table 表名 add index 索引名 (列名,......)

        2.如果是创建主键索引: alter table 表名 add primary key (列1,......)

        删除索引:

        1.普通索引的删除

                drop index 索引名 on 表名

                alter table 表名 drop index index_name

         2.删除主键

                alter table 表名 drop primary key

        查询索引

                show index from 表名 ; show keys from 表名

        索引的使用

        1.下列情况将不使用索引

            1.条件中有or;对于队列索引,不是使用第一部分则不会使用索引;like查询是以%开头;

            2.列类型是字符型,条件中要将数据引起来,否则不使用索引

        查询索引的使用情况

            1.show status like ‘Handler_read%‘;     //显示索引的使用情况

                handle_read_key 越大越好,说明索引使用率比较高

                handle_read_rnd_next 越小越好

        对数据库中表空间的优化命令: 

            optimize table 表名     // 该命令主要用于当删除了某个大表中的数据内容后,表所占的空间并没有释放,使用该命令可以释放出空间

        大批量插入数据

            对于MYISAM:

                    alter table table_name disable keys;

                    loading data;

                    alter table table_name enable keys;

            对于innodb:

                    1.将要导入的数据按照主键排序

                    2.set unique_checks=0,关闭唯一性校验;

                    3.set autocommit=0,关闭自动提交

常用的优化方法:

    1.order by null //当使用group by 分组时,系统默认是排序,为了提高速度可以清除默认排序

    2.建议多使用连接查询join,少用子查询,因为子查询会在内存中建立临时表

    3.在精度要求高的应用中,最好使用decimal(m,n)类型;建议多使用这种类型

    4.时间类型要根据实际的需求选择满足需求的类型

    5.对于超大的表,可以采用表分割技术:水平分割,垂直分割

    6.调整数据库参数的连接数大小,缓存大小

    7.读写分离的实现,一主多辅

基础篇

    /usr/share/mysql目录下,提供了my.cnf主配置文件的参考范本

    linux启动MYSQL的方式:

        cd /usr/bin    ./mysqld_safe &   ;     mysqladmin -uroot shutdown

    如果是通过RPM包安装的:service mysqld start/stop/restart

    DDL基本语句

    create database name; drop database name; desc tablename;show create table tablename\G;

    删除表: drop table tablename; 

    修改表:alter 

优化篇

存储过程

事务

索引

管理维护

    mysql的3种安装方式:

    1.rpm -ivh 安装   //最简易的安装

    2.二进制安装    

            1.用root登录,增加mysql 用户和组,数据库将安装在此用户下 groupadd mysql ;useradd -g mysql mysql

            2.解压二进制安装包,进入压缩包所在目录 tar -xzvf mysql-xxxx.tar.gz

               并对解压后的目录增加一个链接  ln -s mysql-xxx mysql

            3.在数据目录下创建系统数据库和系统表,--user 表示数据库和表的owner用户

                cd mysql    scripts/mysql_install_db --user=mysql

            4.设置目录权限,将data目录owner 改为mysql,其他目录和文件为root

                chown -R root:mysql .        chown -R mysql:mysql data

            5.启动MYSQL

                bin/mysqld_safe --user=mysql &

    3.源码安装

            1.用root登录,增加mysql 用户和组,数据库将安装在此用户下 groupadd mysql ;useradd -g mysql mysql

            2.解压源码,并进入解压目录

                tar -xzvf mysql-xxxx.tar.gz

            3.用configure工具来编译源码,可以有很多参数,参考configure --help 。假定安装/usr/local/mysql

                ./configure --prefix=/usr/local/mysql                  make                make install

            4.复制配置文件到/etc目录下

                cp support-files/my-medium.cnf  /etc/my.cnf

            5.在数据目录下创建系统数据库和系统表,--user 表示这些数据库和表的owner是此用户

                cd /usr/local/mysql    bin/mysql_install_db --user=mysql

            6.设置目录权限,将var 目录owner改为mysql (默认的数据目录),其他目录和文件为root

                chown -R root .         chown -R mysql var       chgrp -R mysql .

            7.启动MYSQL

                bin/mysql_safe --user=mysql &

    mysql升级的3种方法:

    A.方法一:

        1.在目标服务器上安装新版本的MYSQL

        2.在新版本的mysql上创建和老版本同名的数据库

            mysqladmin -h hostname -p port -u user -p passwd create db_name

        3.把老版本mysql上的数据库通过管道导入到新版本数据库中 --opt 采用优化optimize  --compress 压缩

           mysqldump -h 127.0.0.1 -uroot -proot --opt test01 | mysql -h 10.69.160.5 -uroot -proot test01

        4.将旧MYSQL中mysql数据库目录全部cp到新mysql中的数据库目录下

            cp -R /home/mysql_old/data/mysql  /home/mysql_new/data

        5.在新版本服务的shell里面执行mysql_fix_privilege_tables 命令升级权限表,然后重启服务,完成升级

    B.方法二:

        1.在目标服务器上安装新版本的MYSQL

        2.在旧版本MYSQL中,创建用来保存输出文件的目录并用mysqldump备份数据库

            mkdir dumpdir        mysqldump --tab=dumpdir db_name

            --tab 不会生成sql文本,而是在备份目录下对每个表分别生成.sql和.txt文件,.sql保存建表语句.txt保存数据

        3.在新MYSQL服务器上建立新的数据,把旧mysql的备份数据装载到新的服务器上

            cat dumpdir/*.sql | mysql db_name (创建数据库表)      mysqlimport db_name dumpdir/*.txt (加载数据)

                eg:mysqlimport -uroot -p test01 sal.txt --local  //local指定从本地文件去加载数据而不是数据库中

        4.参照方法一中的步骤4,5

    C.方法三:适合MYISAM存储引擎的表,速度最快

        1.安装新数据库

        2.把旧数据中的数据目录下的所有文件(.frm .myd .myi)cp到新版本的相应目录下

        3.参照方法一中的步骤4,5

        总结:数据的升级主要是把旧版本中的数据cp到新版本中,升级前后要保证数据库的字符集一致,防止出现乱码。

                    以上升级方法是假定旧版本的数据没有更新,否则迁移过去的数据将不能保持一致

数据库管理工具

    1.mysql 客户端工具

        -u  -p -h -P端口

        如果系统中的空用户删除了,会检测my.cnf中client下的用户和密码。如果没有就用root@localhost登录

        [root@mysql ~]#mysql -uroot -proot test01 -e "select * from goods"    //-e 参数在没有登录数据情况下,查询信息

        当批量导入sql语句是,使用参数-f(强制) -v(详细信息) --show-warnings(告警信息) 参数,帮助查询错误信息

        [root@mysql ~]#mysql -uroot -proot test01 -f -v --show-warinings <test.sql //向数据库test01中导入数据

    2.myisampack myisam表压缩工具,节省空间,压缩后表只能查询,不能update,insert,delete

    3.mysqladmin 是一个执行管理操作的客户端程序,用来管理当前服务的状态,关闭数据库,建表等操作

    4.mysqlbinlog 日志管理工具

            -d 数据库  //指定数据库的日志

            -o 3    //忽略前几个操作

            -r 导出文件名 //把日志导出到某个文件中

            -s //精简模式显示日志

            --start-datetime ‘2012-10-01‘ --stop-datetim ‘2012-11-01‘  //某个时间段内的日志信息

    5.mysqlcheck Myisam表的维护工具,可以检查和修复myisam表,集成了check,repair,analyze,optimize功能    -c  -r  -a  -o 

    6.mysqldump 数据的备份或在不同数据库间进行数据迁移

            输出内容选项:

                    --add-drop-database   //

                    --add-drop-table         // 

                    -n        //不包含数据库创建语句     -t    //不包含表创建语句    -d    //不包含数据,仅导出创建语句

                   --compact 简洁模式显示   

                    -T 创建两个文件,一个是数据内容,一个是SQL建表语句  //mysqldump -uroot -p test01 goods -T /mnt

                    --default-character-set=name 设置字符集,保证客户端和服务器端的字符集相同,防止导出的数据出现乱码

                    -F 刷新日志,可以在备份前关闭旧日志,开启新的日志,方便后期的恢复和查错

                    -l 给所有表加读取锁,保证在备份过程中,数据更改不了

                    myisam数据库在备份时加上-l 锁定数据表,保证数据在备份过程中数据的完整性;对于Innodb和BDB存储引擎的数据库

                    使用参数--singel-transaction,此参数会生成一个快照,保证数据的一致性。

    7.mysqlhotcopy (Myisam表热备份工具)

            mysqlhotcopy是一个perl脚本,使用lock table,flush table,cp,scp快速备份表,但是仅对myisam表。需要安装perl接口程序

    8.mysqlimport数据库导入工具,把mysqldump -T导出的txt数据导入表中

            mysqlimport [options] db_name file.txt,

    9.mysqlshow 数据库查看工具

            --count  显示统计信息

            -k 显示索引信息     -i 显示状态信息

    10.perror 错误代码查看工具   理解错误代码的含义

    11.replace 文本替换命令

            例:将文本a中的a--aa,b--bb内容进行替换,a中内容被覆盖    replace a aa b bb --a ;replace a aa b bb < a a文件中的内容没有被覆盖,

                    仅显示在输出上

MYSQL的日志

   mysql日志分为4中:

        1.错误日志 --log-error[=file] 启动时加参数表示错误日志位置

        2.二进制日志 --log-bin 启动时加参数

            二进制日志包含所有DDL和DML语句,不包括数据查询语句;日志查看工具mysqlbinlog 

        3.查询日志

        4.慢查询日志

        日志的删除   

        1.reset master 删除所有二进制日志   //mysql> reset master;

        2.purge master logs to ‘mysql_bin.00000x‘ //删除x编号前的所有二进制日志

        3.purge master logs before ‘y-m-d h:m:s‘  //删除指定日期前的所有日志

        4.expire_logs_days=number   //修改my.cnf文件[mysqld],设置日志的过期天数,自动删除日志  log-bin 

          日志的配置都可以通过修改/etc/my.cnf文件进行详细的配置

MYSQL的备份和恢复

        mysql的备份主要分为两种:逻辑备份和物理备份

        逻辑备份对各种存储引擎都能适用;而物理备份因不同的存储引擎存在不同的差异;

        逻辑备份是将数据库中数据备份为一个文本文件,备份的文件可以查看和编辑。使用mysqldump工具实现逻辑备份

        备份例子:

                        mysqldump -uroot -p --all-database > all.sql    //    备份所有数据库中

                        mysqldump -uroot -p test01  > test01.sql    //    备份test01数据库

                        mysqldump -uroot -p test01 sal > sal.sql    //    备份test01数据库中sal 表

        完全恢复:

                        mysqldump -uroot -p dbname < bakfile     //把备份文件恢复

                        mysqlbinlog binlog_file | mysql -uroot -p test //由于恢复备份的数据并不完整,还需要将备份后执行的二进制日志进行重做

         不完全恢复:基于时间的恢复和基于位置的恢复

                        基于时间的恢复:(假如上午10点服务器发生了故障,可以跳过该该时间点进行恢复)

                        mysqlbinlog --stop-date=‘2012-06-12 9:59:59‘ /var/log/mysql/bin.log1 | mysql -uroot -p 

                        mysqlbinlog --start-date=‘2012-06-12 10:01:00‘ /var/log/mysql/bin.log1 | mysql -uroot -p

                        基于位置的恢复:先通过二进制日志定位到特定时间内的错误语句

                        mysqlbinlog --start-date=‘2012-06-12 9:59:00‘ --stop-dat=‘2012-06-12 10:01:00‘ /var/log/mysql/bin.log1 > /tmp/myql/bin.log

                        而后编辑/tmp/mysql/bin.log的内容定位到错误语句的前后的位置号,假如‘111‘,‘120‘, 恢复了以前的文件后,执行如下命令

                        mysqlbinlog --stop-position=‘111‘ /var/log/mysql/bin.log1 \ | mysql -uroot -p 

                        mysqlbinlog --start-posttion=‘120‘ /var/log/mysql/bin.log1 \ | mysql -uroot -p                

        物理备份:物理备份和恢复的速度比更快,是基于文件的cp;分为冷备份和热备份

                        冷备是停掉数据库,备份数据的数据文件和日志文件;然后恢复数据文件,使用mysqlbinlog工具恢复自备份来的所有binlog

                        这种方法对myisam和innodb存储引擎使用,但很少使用冷备。

                        热备对不同的存储引擎有不同的方法,现介绍myisam和innodb两种数据的热备方法:

                        myisam存储引擎:该存储引擎的热备,实质是将备份的表加读锁,然后cp数据到备份目录

                                1.mysqlhotcopy myisam自带的热备份工具    mysqlhotcopy dbnmae /path

                                2.手动锁表 flush tables for read; 然后再执行cp命令

                        innodb存储引擎:该存储引擎可以使用ibbackup工具进行热备份,属于收费软件

        表的导出和导入

            导出 

                   1.select * from tablename into outfile ‘targe-file‘ [options]  //targe-file mysql用户要有该目录有写权限

                        options 参数

                                            fields terminated by ‘string‘    //字段分割符,默认指表符 ‘\t‘

                                            fields [optionally] enclosed by ‘char‘ //字段引用符,如果加optionally只在char,varchar,text等类型上加,默认不使用

                                            fileds escaped by ‘char‘   //转义字符,默认\

                                            lines starting by ‘string‘  //每行前加字符 ‘‘

                                            lines terminated by ‘string‘  //行未加字符串  默认\n

                   2.使用mysqldump -T 命令 导出数据,生成一个txt数据,文件一个表创建脚本的sql文件

                        mysql -uroot -p -T target_dir dbname tablename [option]    //mysql用户要对target_dir目录有写权限

                        option 参数

                                            --fields-terminated-by ‘string‘    //字段分割符,默认指表符 ‘\t‘

                                            --fields-optionally-enclosed-by ‘char‘ //字段引用符,如果加optionally只在char,varchar,text等类型上加,默认不使用

                                            --fileds-escaped-by ‘char‘   //转义字符,默认\

                                            --lines-starting-by ‘string‘  //每行前加字符 ‘‘

                                            --lines-terminated-by ‘string‘  //行未加字符串  默认\n

            导入

                    1.load data infile ‘filename‘ into table tablename [option]

                            option 参数

                                            fields terminated by ‘string‘    //字段分割符,默认指表符 ‘\t‘

                                            fields [optionally] enclosed by ‘char‘ //字段引用符,如果加optionally只在char,varchar,text等类型上加,默认不使用

                                            fileds escaped by ‘char‘   //转义字符,默认\

                                            lines starting by ‘string‘  //每行前加字符 ‘‘

                                            lines terminated by ‘string‘  //行未加字符串  默认\n 

                                            ignore number lines   //number 代表数字,忽略导入数据的前几行

                                            set 列名=exp   //将某个列转换后再加载

例:load data infile ‘/source/mysqlbackup/backup01‘ into table goodsbackup ignore 8 lines set id=id+2;

                2.mysqlimport 

                        mysqlimport -uroot -p dbname data.txt [option]

                                            --fields-terminated-by ‘string‘    //字段分割符,默认指表符 ‘\t‘

                                            --fields-optionally-enclosed-by ‘char‘ //字段引用符,如果加optionally只在char,varchar,text等类型上加,默认不使用

                                            --fileds-escaped-by ‘char‘   //转义字符,默认\

                                            --lines-starting-by ‘string‘  //每行前加字符 ‘‘

                                            --lines-terminated-by ‘string‘  //行未加字符串  默认\n

                                            --igone-lines=number  //忽略前多少行数据

        总结:导出和导入应掌握 select * from into file 和load data infile ,而mysqldump和mysqlimport其实是调用相应的接口而已。同时mysqldump

                   和mysqlimport 是在外部执行的而已,select * from into file 和load data infile 需要登录到数据库内部使用而已。

MYSQL的权限与安全

    用户连接数据库时,权限认证过程分为两部分:

        1.通过user表中user,host,password盘点是否允许用户登录数据库系统

        2.登录成功后,通过下列权限表的顺序得到数据库的权限user--db--tables_priv--columns_priv,一旦匹配就停止向下搜索。

        user表中的每个权限都代表了对所有数据库都有权限;当授予部分数据库的权限是,user表中的权限会设置为no,db表的权限会相应改变;

        用户的创建:grant select on *.* to username@‘hostname/login_IP‘ identified by ‘password‘ [with grant option]

        usage 权限只能登录数据库,不能做任何操作

        修改密码:

                        1.直接修改user表,密码要加password进行加密

                        2.用mysqladmin -u user_name -h host_name password ‘new_password‘

                        3.set password for ‘name‘@‘hostname‘=password(‘xxx‘)

                        4.如果是修改自己的密码:set password=password(‘xxxx‘)

        删除用户:

                        1.直接修改user表

                        2.drop user test@127.0.0.1

    数据库安全:从两个方面进行讨论,操作系统层面和数据库层面

                        操作系统层面:

                                               1.严格控制系统的账号和权限,对mysql用户进行锁定。

                                               2.尽量避免使用root权限启动数据库,对数据库的相应目录进行权限控制

                                               3.防止DNS欺骗,尽量使用ip来管理用户的登录

                        数据库层面:

                                            1.删除匿名用户,系统安装完成后会自动一些默认用户,需要进行管理

                                            2.严格控制user表的权限,不要把file,process,super权限授权给除管理员之外的其他用户

                                                process权限可以查看进程信息,super可以有kill权限

                                            3.删除表命令并不会回收以前的相关访问权限;删除表时,其他用户对此表的权限并没有回收,会导致如果建立同名的表

                                                其他用户会自动授权相关的访问权限,进而产生权限外流;删除表前,一点要手动回收用户权限

                                            4.启用SSL

                                            5.old-passwords,4.1之前的版本密码使用16位,4.1之后的秘密使用41位的。为了保证兼容性,可以用oldpassword设置

                                               4.1后的用户密码;也可以修改my.cnf配置文件,但是对数据库的安全性有所降低。

                                            6.safe-user-create 在my.cnf中启用该参数,表示不能使用grant语句创建新用户,除非用户有mysql数据user表的insert权限

                                            7.secure-auth 使用该参数的作用是让4.1前的客户端无法进行用户认证,及时使用old-passwords也不行。

                                            8.skip-grant-tables 该参数使数据库系统根本不需要使用权限系统,通过使用mysqladmin flush-privileges,mysqladmin reload

                                                    flush privileges,重新加载使用权限系统

                                            9.skip-network 使用该参数会禁止用户通过tcp/ip协议连接数据库

                                            10.skip-show-database 使用该参数会使只有拥有show databases权限的用户才可以查看数据库列表。默认是所有用户都可以查看

MYSQL的复制(主从复制,数据不能保证实施同步)

    复制是将主服务的DDL和DML操作通过二进制日志复制到从服务器上,然后在从服务器上对这些日志重新执行,从而使得主从服务器的数据保持一致。

    SQL复制的优点: 

                            1.如果主服务器故障,可以快速切换到从服务器。

                            2.可以在从服务器上执行查询,降低主服务器的性能

                            3.可以在从服务器上执行备份,以免影响主服务器的性能

    主从复制过程:

        1.至少搭建2台MYSQL数据库,尽可能地使用相同的数据库版本

        2.在主数据库上建立一个复制账号,并授予replication权限。

        3.修改主数据库的my.cnf文件,开启binlog,并设置server-id的值

        4.在主数据库上执行读锁有效,保证没有数据操作建立统一快照// flush tables with lock; 

        5.得到主数据库上的二进制日志名称和位置 //show master status;

        6.备份主数据库上的数据文件,解除表锁定;把主数据库的备份在从数据库上进行恢复  //unlock tables;

        7.在从服务器上登录数据库先停止slave stop ,运行下列的命令然后再开启slave start。

            change master to 

            master_host=‘10.69.160.4‘,

            master_user=‘slave‘, 

            master_password=‘root‘,

            master_log_file=‘/var/lib/mysql/logmes/mysql-bin.1‘,

            master_log_pos=98;

            最后在主服务器上通过命令show slave status \G 查看主从配置是否成功。如果失败查询相应的错误日志

    主从复制的my.cnf配置文件的重要参数:

            log-slave-updates   //从服务器是否开启二进制日志更新,默认关闭。在进行配置链式复制时最好打开

            master-connect-retry=10  //从服务器重试连接主服务器的时间

            read-only 使用该参数可以使从数据库拒绝普通用户的更新操作,只支持超级用户的更新操作

            replicate-do-db=test01    //指定主从复制的数据库

            replicate-do-table=test001    //指定主从复制的表

            replicate-ignore-db=mysql    //指定主从复制时忽略的数据库

            replicate-ignore-table=user     //指定主从复制时忽略的表

            slave-skip-errors=[.....]    //忽略复制过程的相应错误

        总结:主从配置的要点是对my.cnf文件的配置,主的二进制日志,主从的server-id 配置;5.1版本后再配置文件中不在支持master命令

                    可以通过登录数据库使用change master to相应的命令来配置

        主从服务器切换:

            主服务器M,从服务器S1,S2。主M坏,把S1切换为主;

            1.首先保证所有的从服务器都执行完relay log ;然后在每个从服务器是执行stop slave IO_thread;

            2.在从服务器S1上执行 slave stop;然后执行reset master配置为主服务器

            3.在S2上执行slave stop ,然后执行change master to master_host=‘s1_ip‘ ,最后执行slave start

            4.删除新的主服务器中的master.info和relay-log.info文件,否则下次重启时还是按照从服务器启动。

            5.测试中S1开启了bin-log功能,这样在切为主数据库后二进制日志会传到从服务器上,同时S1要关闭

                  log-slave-updates 功能,避免将执行过的二进制日志重复传给S2。

MYSQL的集群

        在很多情况下,术语“节点”用于指计算机,但在讨论MySQL Cluster时,它表示的是进程。

        MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。

        集群分为同步集群和异步集群:

            同步集群:(data+mysql+mgm)

            特点:

                    1.内存级别,对系统硬件要求低,对内存要求高

                    2.数据同时放在几台服务器上,冗余性好

                    3.可以实现高可用性和负载均衡

                    4.建表时必须声明 engine=ndbcluster等特点

            异步集群:(master+slave)

                    1.主从数据库异步数据

                    2.数据放在多个服务器上,冗余一般

                    3.只有实现读写分离时,才能真正实现分担主服务器的压力,高可用性和负载均衡能力不强等

        cluster 主要分三种:

            负载 Load Balancing ;高可用性 High Availability; 高性能 Hight Performance 

        cluster 按照节点的类型可以分为3种:

            1.管理节点

                            管理节点是对其他节点的管理,一个集群中只需要一个管理节点就可以了。在数据的访问过程中,该节点

                            不参与数据的访问,仅对SQL节点和数据节点进行配置管理。

                            管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每个节点从管理服务器检索

                            配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的

                            信息传输 到管理服务器,然后,将这类信息写入 Cluster日志。

                            这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。

                            由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。

                            MGM节点是用命令“ndb_mgmd”启动的

            2.SQL节点

                            SQL节点可以理解为应用和数据节点之间的桥梁,应用不直接访问数据节点,而是由SQL节点访问数据节点

                            然后再由SQL节点去访问数据节点而后返回给应用。一个集群中可以有多个SQL节点,通过每个SQL节点访问

                            的数据都是相同的,SQL节点越多,分配给每个节点的负载就越小,性能就越高。

                            数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。

                            例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。

                            数据节点是用命令“ndbd”启动的。

            3.数据节点

                            数据节点主要用于存放集群中的数据,可以有多个数据节点,每个数据节点可以有多个镜像节点。任何一个数据

                            节点出现故障,只有其镜像节点正常,cluster都可以正常使用。

                            SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的

                             传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到

                            “my.cnf”后使用“mysqld”启动。

集群的管理节点的配置文件config.ini


# MySQL NDB Cluster Medium Sample Configuration File

#

# This files assumes that you are using at least 6

# hosts for running the cluster. Hostnames and paths

# listed below should be changed to match your setup

#

[NDBD DEFAULT]

NoOfReplicas: 1

#DataDir: /add/path/here

#FileSystemPath: /add/path/here

# Data Memory, Index Memory, and String Memory

DataMemory: 300M

IndexMemory: 80M

BackupMemory: 64M

# Transaction Parameters


MaxNoOfConcurrentOperations: 100000

MaxNoOfLocalOperations: 100000

# Buffering and Logging

RedoBuffer: 16M

# Logging and Checkpointing

NoOfFragmentLogFiles: 200

# Metadata Objects

MaxNoOfAttributes: 500

MaxNoOfTables: 100

# Scans and Buffering

MaxNoOfConcurrentScans: 100

[MGM DEFAULT]

PortNumber: 1186

#DataDir: /add/path/here

#

# Change HOST1 to the name of the NDB_MGMD host

# Change HOST2 to the name of the NDB_MGMD host

# Change HOST3 to the name of the NDBD host

# Change HOST4 to the name of the NDBD host

# Change HOST5 to the name of the NDBD host

# Change HOST6 to the name of the NDBD host

#

[NDB_MGMD]

NodeId: 1

HostName: 10.69.160.3

datadir=/var/lib/mysql-cluster/

#ArbitrationRank: 1

[NDBD]

NodeId: 2

HostName: 10.69.160.4

datadir=/usr/local/mysql/data

[NDBD]

NodeId: 3

HostName: 10.69.160.5

datadir=/usr/local/mysql/data

[NDBD]

NodeId: 4

HostName: 10.69.160.6

datadir=/usr/local/mysql/data

#[NDBD]

#Id: 6

#HostName: HOST6

#

# Note: The following can be MySQLD connections or

# NDB API application connecting to the cluster

#

[mysqld]

NodeId: 5

HostName: 10.69.160.4

#ArbitrationRank: 2

[mysqld]

NodeId: 6

HostName: 10.69.160.5

#ArbitrationRank: 2

[mysqld]

NodeId: 7

HostName: 10.69.160.6

#ArbitrationRank: 2

[mysqld]

NodeId: 8

[mysqld]

NodeId: 9

[mysqld]

NodeId: 10

总结:最后一点要加一个[mysqld]的空节点

数据节点和mysql节点的主要配置:

[mysqld]

ndbcluster #运行NDB存储引擎

datadir=/usr/local/mysql/data

basedir=/usr/local/mysql

port=3306  

[mysql_cluster]

ndb-connectstring=10.32.34.116 #声明管理节点

启动的顺序是,管理节点----数据节点-----mysql节点

总结:

    mysql的高可用性方案:双master + keepalived 方案,两台mysql服务器互为主,通过keepalived进行故障切换。

     1. #mkdir /etc/keepalived  

. #vi etckeepalivedkeepalived.conf  
. ! Configuration  keepalived  
. global_defs {  
.      notification_email {  
.      luwenju.cn  
.      }  
.      notification_email_from luwenju.cn  
.      smtp_server .
.      smtp_connect_timeout 
.      router_id MySQLha  
.      }  
.  
. vrrp_instance VI_1 {  
.      state    #两台配置此处均是BACKUP  
.      interface eth0  
.      virtual_router_id 
.      priority    #优先级,另一台改为90  
.      advert_int 
.      nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  
.      authentication {  
.      auth_type PASS  
.      auth_pass 
.      }  
.      virtual_ipaddress {  
.      .
.      }  
.      }  
.  
. virtual_server . {  
.      delay_loop    #每个2秒检查一次real_server状态  
.      lb_algo wrr   #LVS算法  
.      lb_kind DR    #LVS模式  
.      persistence_timeout    #会话保持时间  
.      protocol TCP  
.      real_server . {  
.      weight 
.      notify_down usrlocalMySQLbinMySQL.sh  #检测到服务down后执行的脚本  
.      TCP_CHECK {  
.      connect_timeout     #连接超时时间  
.      nb_get_retry        #重连次数  
.      delay_before_retry    #重连间隔时间  
.      connect_port    #健康检查端口  
.      }  
.      }

编写检测服务down后所要执行的脚本
#vi usrlocalMySQLbinMySQL.sh  
 #!binsh  
 pkill keepalived  
 #chmod x usrlocalMySQLbinMySQL.sh

 注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服 务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作, 因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。后话:世间万事万物,都不具备绝对的完美,就像上面的MySQL-HA一样,keepalived只能做到对3306的健康检查,但是做不到比如像 MySQL复制中的slave-SQL、slave-IO进程的检查。所以要想做到一些细致的健康检查,还得需要借助额外的监控工具,比如nagios, 然后用nagios实现短信、邮件报警,从而能够有效地解决问题。


















本文出自 “咚咚的博客” 博客,谢绝转载!

MySQL 基础知识

标签:基础知识   mysql   

原文地址:http://weadyweady.blog.51cto.com/3012956/1613755

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