MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司,目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维、DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,而且使用的人数越来越多。而且MariaDB兼容mysql所有的功能和相关参数。
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?
MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
MySQL安装方式有两种,一种是yum/rpm安装,另外一种是tar源码安装。
Yum 安装方法很简单,执行命令如下即可: yum install -ymysql-server mysql-devel mysql
源码安装MySQL方式:
cd /usr/src ;
wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz;tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure--prefix=/usr/local/mysql --enable-assembler &&make &&make install
配置Mysql服务为系统服务:
cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
cd /usr/local/mysql
useradd mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql &
createdatabase test_db; 创建名为test_db数据库
use test_db; 进入test_db数据库
show tables; 查看数据库里有多少张表。
create tabletest01 (id varchar(20),name varchar(20));创建名为test01表,并创建两个字段,id、name、数据长度(用字符来定义长度单位。)
insert intotest01 values ("001","wugk1"); 向表中插入数据。
select * fromtest01; 查看test01表数据内容。
grant allprivileges on test_db.* to test@localhost identified by '123456';
grant all on test_db.* to test@localhost identified by '123456';
grant select,insert,update,delete on *.* to test@”%” identified by ‘123456’;
给mysql数据库授权。
flush privileges;刷新权限
mysqldump –uroot –p123456 test_db >/tmp/test.db.sql ;MySQL备份或导出
mysql –uroot –p123456 test_db < /tmp/test.db.sql ;MySQL导入
mysqladmin –uroot –p123456 password newpassword ;修改MySQL root密码
drop databasetest_db ; 删除数据库
drop tabletest01 ; 删除表
delete fromtest01 ; 清空表内容
show variables like '%char%'; 查看数据库字符集
a) 自动备份Mysql数据库脚本
#!/bin/sh
#auto backup mysql
#wugk 2012-12-12
#Define PATH定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#must use root user run scripts 必须使用root用户运行,$UID为系统变量
if
[ $UID -ne 0 ];then
echo This script must use theroot user ! ! !
sleep 2
exit 0
fi
#Define DIR and mkdir DIR 判断目录是否存在,不存在则新建
if
[ ! -d $BAKDIR ];then
mkdir -p $BAKDIR
else
echo This is $BAKDIR exists....
fi
#Use mysqldump backup mysql 使用mysqldump备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB>$BAKDIR/webapp_db.sql
echo "The mysql backup successfully "
在Mysql数据库中,我们插入中文通常会遇到各种乱码问题,如何来解决呢?
修改Mysql字符集为UTF-8的方法:在/etc/my.cnf对应如下配置段加入相应命令。
[client]字段里加入default-character-set=utf8
[mysqld]字段里加入character-set-server=utf8
[mysql]字段里加入default-character-set=utf8
然后重启MySQL服务即可。
MySQL忘记密码解决方法:
首先停止mysql服务,然后以跳过权限方式后台启动:
/usr/bin/mysqld_safe --user=mysql --skip-grant-tables&
然后执行mysql回车进入mysql,然后修改密码。
修改Mysql密码:
Use mysql数据库,然后执行如下命令:
修改完后,停止Mysql,然后再以正常方式启动:
再次以新的密码登陆即可进入Mysql数据库。
Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个IT界的关注。
目前LAMP架构是大多数中小企业最青睐的PHP架构选择,也是众多Linux SA喜欢选择的一套架构。那接下来我们就实战来操作一下,如果来搭建这样一套架构,当然可以使用yum方法,安装命令很简单,一条命令搞定所有。
yum install httpd httpd-devel mysql-server mysql-devel php php-develphp-mysql -y
这一条命令LAMP环境即可安装成功,只需要重启apache、mysql服务即可。
如果想要更多功能和自定义模块,需要使用源码包的方式来安装LAMP架构。如下我们使用源码包来实现LAMP架构安装与配置:
Ø 源码安装LAMP之Apache
yum installapr-devel apr-util-devel –y;
cd /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz;tar xzf httpd-2.2.27.tar.gz ;cdhttpd-2.2.27 ;./configure --prefix=/usr/local/apache --enable-so --enable-rewrite&&make &&make install
Ø 源码安装LAMP之MySQL
cd /usr/src;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz;tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure --prefix=/usr/local/mysql--enable-assembler &&make &&make install
配置Mysql服务为系统服务:
cp/usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp/usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
cd /usr/local/mysql
useradd mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql &
Ø 源码安装LAMP之PHP
cd /usr/src;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2;tar jxf php-5.3.28.tar.bz2 ;cdphp-5.3.28 ;./configure --prefix=/usr/local/php5--with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/
Ø 源码安装Apache+PHP整合
整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句:
LoadModule php5_modulemodules/libphp5.so (默认已存在)
AddType application/x-httpd-php .php
DirectoryIndex index.phpindex.html (把index.php加入index.html之前)
然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令:
cat>>/usr/local/apache/htdocs/index.php <
phpinfo();
?>
EOF
重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。
Ø 源码安装DISCUZ论坛
下载discuz源码包文件,然后解压:
cd /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip
解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/
重命名程序文件:cd /usr/local/apache/htdocs/ ;mv upload/* .
赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/uc_client/
然后访问IP安装discuz论坛,如下图,选择“我同意”
进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。
数据库创建及授权命令如下:
createdatabase discuz charset=utf8;
grant all ondiscuz.* to root@'localhost' identified by "123456";
点击下一步,直至安装完成,进入等待已久的论坛画面:
自此LAMP环境整合并搭建成功,通过IP直接访问即可。
本次课程将给大家带来一个新的工具,让我们在日常企业运维中更好的管理我们的MySQL数据库,通过图形界面更好的管理我们的MySQL数据库。
我们可以对数据进行增删改查,进行各种操作,同时可以导入导出各种形式的文件格式。
本次课程将给大家介绍一个非常流行的工具XtraBackup,在企业里面备份大数据,效率更快更可靠。我们将全面来学习这个工具在企业里面如何使用跟MySQLDUMP工具做对比,同时模拟备份、删除、恢复等真实的案例。
在我们日常的运维工作中,数据是公司非常重要的资源,尤其是数据库的相关信息,如果把数据丢了,将会损失非常大,严重后果会直接走人哦。
所以我们每个人在运维工作中要及时注意网站数据的备份,尤其要注意数据库的备份。那现在遇到问题了,如果我们的数据库数据上百G、甚至上T级别,如果来备份呢,今天我这里只给大家讲解上百G数据的备份哦,T级别大家以后如果有机会会接触到的,当然那个级别备份的方法可能有其他新的方式哦。
MySQL备份的常见方法:
1) Mysqldump备份
2) 直接cp备份
3) Sqlhotcopy
4) 主从同步复制
5) Xtrabackup备份
我们今天主要来讲解Mysqldump和xtrabackup这两个工具:
我们都知道,一般mysqldump备份都会锁表,锁表直接导致数据库只能访问select,不能执行insert、update等操作。
如果是myisam表,当然也可以执行参数--lock-tables=false禁用锁表,但是有可能会造成数据信息不一致。
如果支持事务的表,例如InnoDB和BDB,--single-transaction参数是一个更好的选择,因为它不锁定表。
mysqldump-uroot -p123456 --all-databases --opt --single-transaction > 2014all.sql
(--opt快捷选项,等同于同时添加--add-drop-tables --add-locking --create-option --disable-keys--extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用--skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。)
Xtrabackup工具讲解:
Mysql冷备、mysqldump、mysql热拷贝均不能实现增量备份,在实际环境中增量备份是使用较多的,percona-xtrabackup就是为实现增量备份而生 ,Xtrabackup有两个主要的工具:xtrabackup、innobackupex
xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
使用帮助:http://www.percona.com/docs/wiki/percona-xtrabackup:start
环境:CentOS 6.5 xtrabackup-2.0.0
首先从http://www.percona.com/下载
wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.0/binary/Linux/x86_64/percona-xtrabackup-2.0.0.tar.gz
检查服务器是否安装了Mysql版本,如果没有就要安装好mysql
开始安装xtrabackup
1) 解压文件
tar zxvf percona-xtrabackup-2.0.0.tar.gz
2) 拷贝innobackupex、xtrabackup、xtrabackup_51 xtrabackup_55工具到/usr/bin
cp percona-xtrabackup-2.0.0/bin/innobackupex /usr/bin/innobackupex
cp percona-xtrabackup-2.0.0/bin/xtrabackup /usr/bin/xtrabackup
cp percona-xtrabackup-2.0.0/bin/xtrabackup_51 /usr/bin/xtrabackup_51
cp percona-xtrabackup-2.0.0/bin/xtrabackup_55 /usr/bin/xtrabackup_55
1) 数据库全备份
innobackupex --user=root --password=123456/data/backup/mysql/
最后备份成功打印如下信息:
备份后目录数据如下:
模拟数据库恢复:
删除/data/mysql/目录所有数据:
rm -rf /var/lib/mysql/*
使用如下命令进行恢复:
恢复前先关闭数据库,然后执行如下命令:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /data/backup/mysql/2014-12-20_00-10-24
(Apply-log:数据库在备份是个过程,所有的数据在不同时间点被备份,如果这个时候数据库还有写的操作,那么数据库的备份是不一致的;apply-log会记录整个过程中的相关log;在进行恢复的时候会把已经提交的事务写入数据文件,把没有提交的事务进行回滚。
增量备份apply-incremental-backup 不会对redo log 中没有提交的事务进行回滚,可能下次增量备份事务已经提交了。
这个apply-log过程你可以在任何机器上运行,没有强制在线上或者备份库上运行,你可以把备份复制到闲置的服务器上去运行apply-log,以此来降低备份库的压力,不过,你必须保证backup和apply-log所使用的mysqlbackup的版本要一致)
然后使用参数--copy-back恢复数据:
innobackupex --defaults-file=/etc/my.cnf--user=mysql --password=123456 --copy-back/data/backup/mysql/2014-12-20_00-10-24/
然后授权mysql用户给所有的数据库文件:
chown -R mysql:mysql /var/lib/mysql/
查看数据库恢复信息:
数据完全恢复。
1) 增量备份:
增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
先完全备份:
innobackupex--user=root --password=123456 --databases=wugk01 /data/backup/mysql/
第一次增量:
innobackupex --defaults-file=/etc/my.cnf --user=root--password=123456 --databases=wugk01 --incremental /data/backup/mysql/--incremental-basedir=/data/backup/mysql/2014-12-20_13-01-43/
增量备份完后,会在/data/backup/mysql/目录下生成一个份目录。新的备份
第二次增量备份:
执行如下命令:
innobackupex--defaults-file=/etc/my.cnf --user=root --password=123456 --databases=wugk01--incremental /data/backup/mysql/--incremental-basedir=/data/backup/mysql/2014-12-20_13-07-31/
备份后的目录:
Mysql增量恢复:
innobackupex--defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only /data/backup/mysql/2014-12-20_13-01-43/
innobackupex--defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log --redo-only/data/backup/mysql/2014-12-20_13-01-43/--incremental-dir=/data/backup/mysql/2014-12-20_13-07-31/
innobackupex --defaults-file=/etc/my.cnf--user=root --password=123456 --apply-log --redo-only /data/backup/mysql/2014-12-20_13-01-43/--incremental-dir=/data/backup/mysql/2014-12-20_13-11-20/
innobackupex --defaults-file=/etc/my.cnf --user=root--password=123456 --copy-back/data/backup/mysql/2014-12-20_13-01-43/
数据已经恢复:
自此xtrabackup备份工具讲解完毕,大家在日常运维中可以具体实施积累经验。
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司,目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维、DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,而且使用的人数越来越多。而且MariaDB兼容mysql所有的功能和相关参数。
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?
MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
随着访问量的不断增加,Mysql数据库压力不断增加,需要对mysql进行优化和架构改造,可以使用高可用、主从复制、读写分离来、拆分库、拆分表进行优化。下面我们来学习MySQL主从复制高可用如何来实现。
Ø MySQL数据库主从复制原理
Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。
a) 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。
b) Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)
c) Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
d) Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
环境准备:192.168.33.10为master主服务器,192.168.33.11为slave从服务器。
在主和从服务器都安装mysql相关软件,命令如下:
yum install -y mysql mysql-devel mysql-server mysql-libs
安装完毕后,在Master修改vi /etc/my.cnf内容为如下:
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id= 1
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
replicate-do-db =all
创建/data/mysql数据目录,mkdir –p /data/mysql ;chown –R mysqld:mysqld /data/mysql
启动mysql即可,/etc/init.d/mysqld restart
然后修改slave Mysql数据库my.cnf配置文件内容如下:
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id= 2
auto_increment_offset=2
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
master-host=192.168.33.10
master-user=tongbu
master-pass=123456
master-port=3306
master-connect-retry=60
replicate-do-db=all
在Master数据库服务器上设置权限,执行如下命令:
grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
在Master 数据库执行如下命令:
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000006 | 98 | | |
+------------------+----------+--------------+------------------+
1row in set (0.00 sec)
然后在slave服务器指定master IP和同步的pos点:
change master to
master_host='192.168.33.10',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98;
在slave启动slavestart,并执行show slave status\G查看Mysql主从状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes两个状态为YES,代表slave已经启动两个线程,一个为IO线程,一个为SQL线程。
然后在Master服务器创建一个数据库和表,命令如下:
然后去slave服务器查看是否有mysql_ab_test数据库和相应t0的表,如果存在则代表Mysql主从同步搭建成功:
同样还可以测试在master服务器插入两条数据,在slave查看insert数据是否已同步:
128 master上执行如下图:
129 slave上执行如下图,在master插入的数据已经同步到slave上:
自此Mysql主从搭建完毕,现在有一个问题,如果master服务器down机了,如何快速恢复服务呢?
可以通过两种方法:
第一种方法,如果程序连接的是master的IP,直接在slave服务器上添加master的IP即可。这个手动去操作,而且需要花费时间比较长,可能还会出现误操作的情况,不推荐。
第二种方法,可以使用keepalived、heartbeat作为HA检测软件,检查MySQL服务是否正常,不正常则自动切换到slave上,推荐使用。
1) MyISAM引擎:
默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法)的缩写,它是存储记录和文件的标准方法.不是事务安全的,而且不支持外键,如果执行大量的select, MyISAM比较适合。
2) InnoDB引擎:
支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。Innodb最初是由innobase Oy公司开发,2005年10月由oracle公司并购,目前innodb采用双授权,一个是GPL授权,一个是商业授权。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
3) 总体来讲:
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
① MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
② InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
4) 如何查看数据库引擎:
一般情况下,MySQL会默认提供多种存储引擎,可以通过下面的查看:
① 查看MySQL现在已提供什么存储引擎: mysql> show engines;
② 查看MySQL当前默认的存储引擎: mysql> showvariables like '%storage_engine%';
③ 查看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎): mysql> show create table 表名;
查看表使用的引擎:show create table test_t0;
1) 修改MySQL表空间引擎:
设置InnoDB为默认引擎:在配置文件my.cnf中的 [mysqld] 下面加入default-storage-engine=INNODB 然后重启mysqld服务即可。
可以修改表引擎方法如下:
altertable t1 engine=myisam;
alter table t1 engine=innodb;
如果添加innodb引擎报错,需要执行如下命令:
删除/mysql/data目录下的ib_logfile0,ib_logfile1文件即可。
MySLQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。
如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。
常见所以类型:
1) normal:表示普通索引
2) unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
3) full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。
创建索引命令:
ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。(我这里以t1表为例来讲解)
ALTER TABLE t1 ADD INDEX index_name (column_list)
ALTER TABLE t1 ADD UNIQUE (column_list)
ALTER TABLE t1 ADD PRIMARY KEY (column_list)
或者使用create创建
CREATE INDEX index_name ON t1 (column_list)
CREATE UNIQUE INDEX index_name ON t1 (column_list)
删除索引
DROP INDEX index_name ON talbe_name
ALTER TABLE t1 DROP INDEX index_name
继前面章节MySQL主从配置完毕后,接着配置keepalived服务,主要用于Mysql故障自动切换。那说到keepalived,keepalived到底是什么呢?
keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。
Keepalived安装配置:
tar zxf keepalived-1.2.1.tar.gz
cd keepalived-1.2.1&&./configure --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686&&make && make install
DIR=/usr/local/ ;cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p/etc/keepalived
cp $DIR/sbin/keepalived /usr/sbin/
修改Master 服务器上keepalived.conf配置如下,vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
}
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
# VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_intefaceeth0
virtual_router_id 151
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.33.100
}
}
virtual_server 192.168.33.100 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.10 3306{
weight 100
notify_down/data/sh/mysql.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Mysql 从服务器配置keepalived.conf跟master一样,只需要把Realserver IP修改成real_server 192.168.33.11 ;优先级从100改成90即可。
在master、slave数据库上创建/data/sh/mysql.sh脚本,内容为:
pkill keepalived
然后分别重启两台数据库上keepalived服务即可。最后测试停止masterMysql服务,是否会自动切换到Backup上。
DRBD(DistributedReplicatedBlockDevice)是一个基于块设备级别在远程服务器直接同步和镜像数据的开源软件,类似于RAID1数据镜像,通常配合keepalived、heartbeat等HA软件来实现高可用性。
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能,当你将数据写入本地文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中。
本地(master)与远程主机(backup)的保证实时同步,如果本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据。
通过本次课程的学习,大家可以熟练构建企业级MySQL+DRBD+Keepalived高性能高可用架构,满足企业网站高效的访问,有突发故障及时切换。
一、实施环境
系统版本:CentOS 5.8
DRBD版本: drbd-8.3.15
Keepalived:keepalived-1.1.15
Master:192.168.149.128
Backup:192.168.149.129
二、初始化配置
1) 在128、129两台服务器/etc/hosts里面都添加如下配置:
192.168.149.128 node1
192.168.149.129 node2
2) 优化系统kernel参数,直接上sysctl.conf配置如下:
net.ipv4.ip_forward= 0
net.ipv4.conf.default.rp_filter= 1
net.ipv4.conf.default.accept_source_route= 0
kernel.sysrq= 0
kernel.core_uses_pid= 1
net.ipv4.tcp_syncookies= 1
kernel.msgmnb= 65536
kernel.msgmax= 65536
kernel.shmmax= 68719476736
kernel.shmall= 4294967296
net.ipv4.tcp_max_tw_buckets= 10000
net.ipv4.tcp_sack= 1
net.ipv4.tcp_window_scaling= 1
net.ipv4.tcp_rmem= 4096 87380 4194304
net.ipv4.tcp_wmem= 4096 16384 4194304
net.core.wmem_default= 8388608
net.core.rmem_default= 8388608
net.core.rmem_max= 16777216
net.core.wmem_max= 16777216
net.core.netdev_max_backlog= 262144
net.core.somaxconn= 262144
net.ipv4.tcp_max_orphans= 3276800
net.ipv4.tcp_max_syn_backlog= 262144
net.ipv4.tcp_timestamps= 0
net.ipv4.tcp_synack_retries= 1
net.ipv4.tcp_syn_retries= 1
net.ipv4.tcp_tw_recycle= 1
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_mem= 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout= 1
net.ipv4.tcp_keepalive_time= 30
net.ipv4.ip_local_port_range= 1024 65530
net.ipv4.icmp_echo_ignore_all= 1
3)两台服务器分别添加一块设备,用于DRBD主设备存储,我这里为/dev/sdb20G硬盘;
执行如下命令:
mkfs.ext3/dev/sdb ;dd if=/dev/zero of=/dev/sdb bs=1M count=1;sync
三、DRBD安装配置
Yum方式安装:
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
yum -yinstall drbd83* kmod-drbd83 ; modprobe drbd
源码安装方式:
http://oss.linbit.com/drbd/8.4/drbd-8.4.4.tar.gz
./configure --prefix=/usr/local/drbd --with-km
make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/
make install
cp drbd/drbd.ko /lib/modules/`uname -r`/kernel/lib/
Yum方式和源码方式都需要执行:modprobedrbd 加载DRBD模块。
安装完成并加载drbd模块后,vi修改/etc/drbd.conf配置文件,本文内容如下:
global {
usage-count yes;
}
common {
syncer { rate100M; }
}
resource r0 {
protocol C;
startup {
}
disk {
on-io-error detach;
#size 1G;
}
net {
}
on node1 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.149.128:7898;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/sdb;
address 192.168.149.129:7898;
meta-disk internal;
}
}
配置修改完毕后执行如下命令初始化:
drbdadmcreate-md r0 ;/etc/init.d/drbd restart ;/etc/init.d/drbdstatus
如下图:
以上步骤,需要在两台服务器都执行,两台都配置完毕后,在node2从上面执行如下命令:/etc/init.d/drbd status 看到如下信息,表示目前两台都为从,我们需要设置node1为master,命令如下:
drbdadm -- --overwrite-data-of-peer primary all
mkfs.ext4 /dev/drbd0
mkdir /app ;mount /dev/drbd0 /app
自此,DRBD配置完毕,我们可以往/app目录写入任何东西,当master出现宕机或者其他故障,手动切换到backup,数据没有任何丢失,相当于两台服务器做网络RAID1。
四、Keepalived配置
wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz; tar -xzvf keepalived-1.1.15.tar.gz ;cd keepalived-1.1.15 ; ./configure ; make;make install
DIR=/usr/local/;cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ ; cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ ;
mkdir -p/etc/keepalived ; cp $DIR/sbin/keepalived /usr/sbin/
两台服务器均安装keepalived,并进行配置,首先在node1(master)上配置,keepalived.conf内容如下:
!Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_scriptcheck_mysql {
script "/data/sh/check_mysql.sh"
interval 5
}
vrrp_instanceVI_1 {
state MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.149.100
}
track_script {
check_mysql
}
}
然后创建check_mysql.sh检测脚本,内容如下:
#!/bin/sh
A=`ps -Cmysqld --no-header |wc -l`
if
[ $A -eq 0];then
/bin/umount/app/
drbdadmsecondary r0
killallkeepalived
fi
添加node2(backup)上配置,keepalived.conf内容如下:
!Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_sync_groupVI{
group {
VI_1
}
notify_master/data/sh/master.sh
notify_backup/data/sh/backup.sh
}
vrrp_instanceVI_1 {
state BACKUP
interface eth0
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.149.100
}
}
创建master.sh检测脚本,内容如下:
#!/bin/bash
drbdadmprimary r0
/bin/mount/dev/drbd0 /app/
/etc/init.d/mysqldstart
创建backup.sh检测脚本,内容如下:
#!/bin/bash
/etc/init.d/mysqldstop
/bin/umount/dev/drbd0
drbdadmsecondary r0
发生脑裂恢复步骤如下:
Master执行命令:
drbdadm secondary r0
drbdadm -- --discard-my-data connect r0
drbdadm -- --overwrite-data-of-peer primary all
Backup上执行命令:
drbdadm secondary r0
drbdadm connect r0