MySql笔记

来源:互联网 发布:国际大酒店网站源码 编辑:程序博客网 时间:2024/06/14 04:36

MySql:

(1).非关系型数据库:键值(Key-Value)
代表产品:Memcached(纯内存数据库),
Redis(持久化数据库,支持内存和磁盘),
MemcacheDB,BerkeleyDB
(2).列存储数据库:(Column-oriented)
代表产品:HBase,Cassandra
(3).面向文档数据库:(Document-Oriented),可以使用 xml,json来存储数据
代表产品:MongoDB,CouchDB
(4).图形数据库:(Graph)
代表产品:Neo4J,InfoGrid

1、源码安装

1.2、MySql5.0.xx-5.1.xx 源码编译安装(./configure make make install);
MySql5.5.xx-5.6.xx ,采用cmake或gmake方式编译安装;

1.2.1、安装cmake
安装yum -y install ncurses-devel bison gcc gcc-c++
./configure
make
make install

1.2.3、源码安装mysql-5.5.32
编译安装

cmake . -DCMAKE_INSTALL_PREFIX=/home/mysql/cmake-2.8.8/  \-DMYSQL_DATADIR=/data/app//3306/data \-DMYSQL_UNIX_ADDR=/data/app/3306/mysql.sock \-DDEFAULT_CHARSET=utf8 \-DDEFAULT_COLLATION=utf8_general_ci \-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \-DENABLED_LOCAL_INFILE=on \-DWITH_INNOBASE_STORAGE_ENGINE=1 \-DWITH_FEDERATED_STORAGE_ENGINE=1 \-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \-DWITH_FAST_MUTEXES=1 \-DWITH_ZLIB=BUNDLED \-DENABLED_LOCAL_INFILE=1 \-DWITH_READLINE=1 \-DWITH_EMBEDDED_SERVER=1 \-DWITH_DEBUG=0
    make     make install

3.3、创建用户

groupadd -u mysql useradd -u 5001 -g mysql -s /sbin/nologin   -d /home/ mysql  mysql  

注意:“-s /sbin/nologin” 禁止该用户登录

3.4、

3.5、配置
3.5.1、cp support-files/my-small.cnf /etc/my.cnf
3.5.2、配置环境变量:export PATH=/home/mysql/app/bin:$PATH
3.5.3、权限:chown -R mysql.mysql ./mysql/app/data/
3.5.4、chmod -R 1777
3.5.5、初始化:

[root@web app]# /home/mysql/app/scripts/mysql_install_db --basedir=/home/mysql/app --datadir=/home/mysql/app/data --user=mysql
WARNING: The host 'web.localdomain' could not be looked up with resolveip.This probably means that your libc libraries are not 100 % compatiblewith this binary MySQL version. The MySQL daemon, mysqld, should worknormally with the exception that host name resolving will not work.This means that you should use IP addresses instead of hostnameswhen specifying MySQL privileges !Installing MySQL system tables...OKFilling help tables...OKTo start mysqld at boot time you have to copysupport-files/mysql.server to the right place for your systemPLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !To do so, start the server, then issue the following commands:/home/mysql/app/bin/mysqladmin -u root password 'new-password'/home/mysql/app/bin/mysqladmin -u root -h web.localdomain password 'new-password'Alternatively you can run:/home/mysql/app/bin/mysql_secure_installationwhich will also give you the option of removing the testdatabases and anonymous user created by default.  This isstrongly recommended for production servers.See the manual for more instructions.You can start the MySQL daemon with:cd /home/mysql/app ; /home/mysql/app/bin/mysqld_safe &You can test the MySQL daemon with mysql-test-run.plcd /home/mysql/app/mysql-test ; perl mysql-test-run.plPlease report any problems with the /home/mysql/app/scripts/mysqlbug script!

3.5.6、配置启动文件

cp support-files/mysql.server /etc/init.d/mysqld

3.5.7、启动

/etc/init.d/mysqld start

3.5.8、修改密码:

[root@web mysql]# mysqladmin -u root password 'abcd.1234'[root@web mysql]# more /etc/sysconfig/i18n LANG="en_US.UTF-8"SYSFONT="latarcyrheb-sun16" 

3.5.9、登录:

[root@web mysql]# mysql -uroot -p'abcd.1234'[root@web mysql]# chkconfig --add mysqld[root@web mysql]# chkconfig --list mysqldmysqld          0:off   1:off   2:on    3:on    4:on    5:on    6:off

4、多实例安装
不同数据目录{3306,3307,3308}/data
4.1、安装依赖包
yum -y install ncurses-devel libaio-devel
编译安装,cmake方式安装
创建用户,mysql内置用户,必须得事先创建
创建相应目录,授权限
mkdir -p /home/mysql/app/{3306,3307,3308}/data/

4.2、配置文件
more /home/mysql/app/3307/my.cnf

[client]port            = 3307socket          = /home/mysql/app/3307/mysql.sock[mysql]no-auto-rehash# The MySQL server[mysqld]port            = 3307socket          = /home/mysql/app/3307/mysql.sockbasedir         =/home/mysql/appdatadir         =/home/mysql/app/3307/dataskip-external-lockingkey_buffer_size    = 16Kmax_allowed_packet = 1Mtable_open_cache   = 4sort_buffer_size    = 64Kread_buffer_size    = 256Kread_rnd_buffer_size = 256Knet_buffer_length   = 2Kthread_stack       = 128Kserver-id          = 2[mysqldump]quickmax_allowed_packet  = 16M[myisamchk]key_buffer_size = 8Msort_buffer_size = 8M[mysqlhotcopy]interactive-timeout[mysqld_safe]log-error   =/home/mysql/app/3307/mysql_web.localhost.errpid-file    =/home/mysql/app/3307/mysqld.pid

:g/3306/s//3307/g
:%s/3306/3308/g

4.3、

4.4、初始化

./mysql_install_db --basedir=/home/mysql/app  --datadir =/home/mysql/app/3307/data --user=mysqlfind / -type f  -name 'mysql' |xargs chmod +x find / -type f  -name "mysql" -exec chmod 700 {} \netstat -pan|grep 330[6-8]

4.5 、启动
多实例启动文件

mysqld_safe  --defaults-file=/home/mysql/app/3307/my.conf  2>&1 > /dev/null &

排错:

170815 17:32:27 [ERROR] Can't start server : Bind on unix socket: Permission denied170815 17:32:27 [ERROR] Do you already have another mysqld server running on socket: /home/mysql/app/mysql.sock ?170815 17:32:27 [ERROR] Aborting

解决方案:查看my.cnf文件,找出mysql.sock文件路径并赋予相应权限。

登录:
mysql -uroot -p “abcd.1234” -S /home/mysql/app/3306/mysql.sock //本地sock登录
mysql -uroot -p “abcd.1234” -S /home/mysql/app/3306/mysql.sock -U //本地登录,强制where条件。
mysql -uroot -p ‘abcd.1234’ -h 10.37.2.120 -P 3306 //远程登录
mysqladmin -u root -p’abcd.1234’ -S /home/mysql/app/3307/mysql.sock shutdown

4.6、修改密码
mysqladmin -u root password ‘abcd.1234’ -S /home/mysql/app/mysql.sock;//设置密码

mysqladmin -u root -p’abcd.1234’ password ‘ckf77856’ -S /home/mysql/app/mysql.sock //修改密码
4.7、密码找回:
4.7.1、
mysql> update mysql.user set password=password(ckf77856) where user=’root’;
mysql> flush privileges;
4.7.2、
修改密码(忽略密码校验):
mysqld_safe –defaults-file=/home/mysql/app/3307/my.conf –skip-grant-tables –user=mysql
mysql -uroot -p -S /home/mysql/app/3307/mysql.sock //登录密码为空
通过update更新密码,在flush privileges。
重启数据库

mysql> system ps -ef|grep mysqld|grep -v grep
/etc/init.d/mysqld 是一个shell启动脚本,启动调用顺序:mysqld_safe–>mysqld

mysql> show create database mysql \G
create database mysql default character set collate gbk_chinese_ci;

mysql> show grants for root@localhost;

远程 :
create user test@’10.37.2.100/24’ identified by “ckf77856”;
mysql -utest -p”ckf77856” -h 10.37.2.111 -P3307

grant all on mysql.* to omc@’10.37.2.%’ identified by ”;
grant all on mysql.* to omc@’10.37.2.1/24’ identified by ”;

mysql -uroot -p’ckf77856’ -e ‘show grants from root@localhost;’|grep -i grant|tail -l|tr ‘,’ ‘\n’ >root_grant.log
mysql> select * from user where user=’root’ and host=’localhost’\G;

create table t2 (
id int not null auto_increment,
name char(20),
remark varchar(10),
primary key(id),//主键
key index_name(name)//普通索引
) engine=innodb default charset=latin1;
5.1 默认引擎是myisam,5.5默认是innodb.

alter table t2 add primary key(id);

基于某列前几行创建索引
create index index_name on tbs(column(len));
show index from t2/G;
联合索引:index(a,b,c)仅a,ab,abc三个查询条件可以走索引,其余不行。
drop index index_name on tbs;

备份:
mysqldump -uroot -pckf77856 -B mysql >/tmp/mysql_dump.sql
-B:删除原库,创建新库还原数据
还原:mysql -uroot -pckf77856

打开log-bin=mysql3306-bin选项,mysql会把库日志记录下来,可使用mysqlbinlog 来查看。
如果数据库发生故障,需要恢复,但是库不能停止,log-bin数据不能被覆盖,这时可以使用日志切割法来实现(mysqladmin -uroot -pckf77856 flush-log)日志切换
mysqlbinlog -d test mysqlbin_test.00001 >test.sql;//binlog转换成sql语句恢复。
系统服务启动顺序:ls -l /etc/rc.d/rc3.d (’s’开头的进程为开启状态,’k’为停止状态)

MySQL数据库字符集包括字符集(character)和校对规则(collation);而校对规则是定义比较字符串的方式。latin1_swedish_ci则为校对规则。

乱码:
数据库 utf8 ,
test表latin1 ,插入中文会乱码,可以set names latin1 临时解决。
在恢复数据的时候防止乱码,可以通过:mysql -uroot -pckf77856 –default-character-set=latinl test

for myisam:

mysqldump -uroot -pckf77856 -A -F -x –flush-privileges –master-data=1 –triggers –routines –events –hex-blob >/tmp/all_db.bak

for innodb:

mysqldump -uroot -pckf77856 -A -F –flush-privileges –single-transaction –master-data=1 –routins –events –hex-blob >/tmp/all_db.bak

以base64格式格式输出binlog日志

mysqlbinlog –base64-output=”decode-rows” -v mysql3306-bin.000461

binlog日志格式:
set session|global set binlog_format=”statement”|”row”|”mixed”;

全量备份&增量备份
全量:
添加’-A’参数
增量:
mysql-bin-log属于增量备份

rsync -avz /home/mysql/3306/data/* root@10.37.2.111: /home/mysql/3307/data –password-file=/etc/rsync.password

恢复:
备份恢复:
法1.mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock

法2. mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock test gzip -d /tmp/mysql_test.gzip//解压gzip备份文件。

法3.source /home/mysql/app/3307/test.sql
mysqlbinlog记录所有库,所有表的DML,DDL日志,并不能分库分表记录,但是在恢复的时候可以指定’-d’ 指定库恢复。

法4. 全备+增量备份恢复
全备+增量备份可以恢复数据,全备需要加’-B’参数,查看全备binlog位置点或者查看主库的master.info文件,确定备份binlog位置点(主库只读模式),在还原的时候首先刷新binlog
全备:mysqldump -uroot -p’ckf77856’ -B -A -F -x –master-date=1|gzip > mysql3306-bin.sql.gz
解压:gunzip -d mysql3306-bin.sql.gz
binlog转换成sql文件:mysqlbinlog mysql3306-bin.sql >binlog3306.sql
查看‘binlog3306.sql’备份文件,确定备份文件最后一次备份的位置点,确定位置点然后去主库拿后续的binlog日志,做增量恢复。
全量恢复:mysql -uroot -pckf77856 < mysql3306-bin.sql
增量恢复:(binlog转换成sql文件)
mysqlbinlog mysql3306-bin.000553 > mysql3306-bin_000553.sql
查看mysql3306-bin_000553.sql,确定误操作语句和误操作时间点,编辑…。
指定库导入:
mysql -uroot -pckf77856 test< mysql3306-bin_000553.sql

注意:在恢复的时候,mysql会产生binlog,这些binlong不是我们需要的,需要避免,但是binlog有用户DML操作需要保留。如果
增量恢复:
主从全量+增量恢复:
1、发现故障,切换binlog;
2、全量+增量备份恢复,“最近一次全备”和“全备到故障发生时间点之间的binlog增量备份数据”
3、增量恢复时建议停止写操作,如果业务重要还不能停止写操作
3.1、停止写操作:
(1).恢复全量
(2).增量binlog转换成sql,编辑sql文件在增量恢复
3.2、不能停止写操作
(1).因为有数据写入,所以会产生新的binlog,按照正常方式来恢复会丢失一部分数据,所以这个时候最好搭建主从模式,使主从数据一致
(2).断开从库的sql apply进程,主库binlog可以正常传输,但是从库不要应用(记住增量binlog位置,也可以查看relay-log.info获取增量binlog位置信息 )。
(3).从库全量恢复+增量恢复(去掉故障sql语句),这个时候从库达到故障恢复点的状态
(4).故障恢复点之后的数据,利用主库传输过来的binlog来恢复(去掉故障sql语句)。
(5).主从切换

test.sql内容:
DROP TABLE IF EXISTS t2;
/!40101 SET @saved_cs_client = @@character_set_client /;
/!40101 SET character_set_client = utf8 /;
CREATE TABLE t2 (
id int(11) DEFAULT NULL,
name char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/!40101 SET character_set_client = @saved_cs_client /;

LOCK TABLES t2 WRITE;
INSERT INTO t2 VALUES (1,’c’,’hnanet’),(2,’h’,’????’),(3,’r’,’??’),(4,’z’,’??-???1’),(5,’g’,’??2’);
UNLOCK TABLES;
以上有乱码,在导出的时候可以指定字符集导出 –default-character-set=latin1

binlog恢复:
mysqlbinlog mysql3306-bin.000063 >binlog_63.sql
指定库恢复:
mysqlbinlog mysql3306-bin.000063 -d test >binlog_63_test.sql
指定位置点恢复(也可以指定时间来恢复,建议使用位置来恢复):
mysqlbinlog mysql3306-bin.000063 –start-posiition=3306 –sto-position=3396 -r 3306_3396_binlog.sql;

key_buffer_size//myasim 引擎索引缓冲区
临时设置key_buffer全局变量(永久生效需要在my.cnf修改):
mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock -e”set global key_buffer_size=1024*1024*8;”

MySql主从同步:
MySql支持单向、双向、链式级联,实时,异步复制;在复制过程中,一台主(master),一台或多台备(slave)。
读写分离(插件、自己开发程序;一般的网站读的多,写的少。主库负责写,多个从库负责读),hash负载均衡,健康检查。
这里写图片描述
主从同步:
主库是由io processes来完成主从同步,主库需要开启binlog,主库要保证传输binlog用户存在,确保从库的master.info信息正确。

从库需要2个进程来完成,分别为 io slave、sql slave 。从库主动寻找主库,需要得到主库的如下信息:
mater_host、master_port、master_user、master_password、master_log_file(binlog)、master_log_pos,存放在从库的master.info文件中。。在从库打开同步机制 开启start_slave。开始同步机制之后,首先由从库的io slave进程请求主库binglog,由从库的master_log_file(binlog)、master_log_pos参数决定主库binlog位置,发送给从库,从库获取这些binlog并存放在从库的relay-log中并更新从库的master.info(主要更新master_log_file、master_log_pos参数),由从库的sql slave来应用这些文件进行同步。
这里写图片描述
MySql主从复制原理:
简单说主库开启binlog功能,由从库根据master.info信息去主库把指定的binlog拿到从库,放在replay-log中,由从库的sql slave进程去解析执行,达到主从一致的目的。
MySql主从同步步骤:
1、环境信息:

2、修改主库my.cnf文件
主库开启binlog,确定 server-id唯一性。
server-id=1 #设置服务器id,为1表示主服务器,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
log_bin=mysql-bin #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了。
binlog-do-db=osyunweidb #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行;如果想同步整个库,这个参数可不写。
binlog-ignore-db=mysql #不同步mysql系统数据库;mysql数据库是系统配置信息,不建议同步。
3、在主库添加同步用户及权限
grant replication slave on . to ‘bobo’@’10.37.2.%’ identified by ‘ckf77856’;
flush privileges;
4、主库备份
mysql> flush table with read lock;( MySql 5.1使用 flush tables with read lock;)
mysql> show master status;
mysql>mysqldump -uroot -pckf77856 -S /home/mysql/app/3306/mysql.sock -A -B -F –events –master-data=2 >/tmp/3306_master.sql;
注意:锁表之后备份数据库使用了‘-F’参数,会强制刷新binlog会导致位置点(postition)变化,由于锁表无dml操作,所以不用担心会有数据未备份,建议不要加‘-F’。
添加“–master-data=2”参数在备份信息有记录binlog位置。
mysql> unlock tables;
5、配置从库
5.1、修改从库参数:
vi /etc/my.cnf #编辑配置文件,在[mysqld]部分添加下面内容
server-id=2 #此参数不能与集群其他库重复,唯一值。
log-bin=mysql-bin #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加了;
replication-do-db=osyunweidb #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行;如果想同步整个库,这个参数可不写。
replication -ignore-db=mysql #不同步mysql系统数据库;mysql数据库是系统配置信息,不建议同步。
replication-do-table=
replication-ignore-table=
replication-wild-do-table=”; 通配同步表
replication-wild-ignore-table=”

6、恢复从库:
[root@web ~]# mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock [root@web ~]# mysql -ubobo -pckf77856 -h 192.168.21.169 -P3306 #远程登录3306端口数据库
mysql> change master to
-> master_host=’10.37.2.111’,
-> master_port=3306,
-> master_user=’bobo’,
-> master_password=’ckf77856’,
-> master_log_file=’mysql3306-bin.000455’,
-> master_log_pos=107;
Query OK, 0 rows affected (0.02 sec)
7、备库开启同步
mysql> start slave;
mysql> show slave status\G;
至此主从同步完成。
如果从库级联从库,需要打开binlog 和 log-slave-updates参数。
主库binlog文件和Position点跟从库的relay-log.info、master.info信息一致。
relay-log.info信息提供sql salve进程使用,master.info提供给io slave进程使用。

[+扩展] 如果从库做级联,需要设置从库,步骤如下:

从库级联:
8、从库配置
8.1 开启binlog,设置log-slave-updates参数
8.2 expire_logs_days = 7 设置过期时间

[+扩展] 如果做读写分离,步骤如下:
读写分离
配置my.cnf,添加read-only参数。
read-only参数来防止写从库操作,注意拥有管理员或all privileges权限会忽略read-only限制。

忽略授权表

[+扩展] 如果做主从角色切换,步骤如下:
主从切换
7、主从同步环境中,主库宕机;有计划切换主从,主库需要锁表。
7.1、查看从库同步状态
show processlist\G
7.2、.查看从库master.info文件,查看binlog日志位置点跟主库的binlog更接近,则丢失数据最少可以作为主库。
提示:如果主库可以访问到binlog日志,可以直接去主库拉取binlog日志到从库。
半同步需要5.5版本以上。
7.3、.主从切换
7.3.1、在每个从库执行 stop slave io_thread,停止日志传输。
7.3.2、在执行主从切换的时候,确保从库sql apply执行完毕。show processlist 观察’Has all relay log’状态,表示从库更新完毕。
7.3.3、从库执行stop slave; reset master; 删除从库master.info、relay-log.info文件;检查从库授权表,用于同步的用户权限。
7.3.4、配置从库my.cnf文件
开启从库binlog,
删除从库log-slave-updates,read-only等参数。
7.3.5、其他从库配置信息
stop slave
change master to master_host=”;//如果不同步,请指定pos位置点
……………….
start slave;
show slave status\G
双向同步
双向同步机制,需要注意表主键自增长序列,“[mysqld] auto_increment_increment = 2 #自增步长,如1 3 5 7
auto_increment_offset = 1 #ID初始值”;
双向复制需要主从打开binlog,配置log-slave-updates,expire_logs_days参数。主从配置change master参数
注意:授权表及用户
创建自增表:
create table stu(
id int(4) not null auto_increment,
name char(20) not null,
primary key(id)
);

参数解析:
mysql> show slave status\G

*************************** 1. row ***************************Slave_IO_State: Waiting for master to send event Master_Host: 10.37.2.100  Master_User: bobo  Master_Port: 3309  Connect_Retry: 60   Master_Log_File: binlog.000002   Read_Master_Log_Pos: 1062   Relay_Log_File: web-relay-bin.000008    Relay_Log_Pos: 335    Relay_Master_Log_File: binlog.000002    Slave_IO_Running: Yes   Slave_SQL_Running: Yes   Skip_Counter: 0    Exec_Master_Log_Pos: 1062     Relay_Log_Space: 489    Master_SSL_Allowed: No    Seconds_Behind_Master: 0    Master_SSL_Verify_Server_Cert: No    Master_Server_Id: 91 row in set (0.00 sec)

show character set;//查看数据库支持字符集
show variables;//查看库当前参数
show status;//查看库当前状态
show global status;//
log_queries_not_using_indexes//未使用索引的sql日志
log_slow_queries//慢查询sql日志
set global key_buffer=512M;//在不停库的情况下修改参数
explain select * from t2;//查看执行计划
show processlist;//查看库当前会话
show full processlist;
innodb_flush_log_at_trx_commit

[root@web 3308]# mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock -e “show character set”;
[root@web 3308]# mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock -e”show global status like ‘%select%’;”//查询计数器

[root@web 3308]# mysql -uroot -pabcd.1234 -S /home/mysql/app/3307/mysql.sock -e “show variables like ‘%character%’ “;
+————————–+———————————+
| Variable_name | Value |
+————————–+———————————+
| character_set_client | utf8 |#客户端字符集
| character_set_connection | utf8 |#连接字符集
| character_set_database | utf8 |#库字符集,配置文件制定
| character_set_filesystem | binary |
| character_set_results | utf8 |#返回结果字符集
| character_set_server | utf8 |#服务器字符集,配置文件制定
| character_set_system | utf8 |
| character_sets_dir | /home/mysql/app/share/charsets/ |
+————————–+———————————+

*库客户端字符集根据系统字符集改变而改变。
*上面3个字符集如果不指定,默认会跟系统字符集一致。
修改字符集:
alter database character set * 或 alter table tbs character set *,已有字符集修改,需要先把内容导出在导入。
MySql引擎
MyISAM引擎特点:
(1)、不支持事务:
(2)、表级锁定(更新时锁定整个表):其锁定机制是表级索引,
(3)、读写互相堵塞:不仅会在写入的时候堵塞读取,MyISAM还会在读取的时候堵塞写入,但读不会堵塞读。
(4)、只会缓存索引:MyISAM可以通过key_buffer_size缓存索引,以大大提高访问性能减少磁盘I/O,但是这个缓存区只会缓存索引,而不会缓存数据。
(5)、读取速度快
不支持外检约束
消耗资源比较低
MyISAM引擎默认是5.5版本前的引擎
MyISAM引擎调优精要:
(1)、设置合适的索引(缓存索引)
(2)、调整读写优先级,要么读多要么写多。
(3)、启用延迟插入改善大批量写入性能
(4)、尽量顺序操作,插入数据写到尾部,减少堵塞
(5)、降低并发
(6)、减少时间长的操作
我们也可以把主库使用innodb引擎,从库使用MyISAM引擎(从库只读场景)。

Innodb引擎特点:
共享表空间,默认只有一个存储文件ibdatal,当然也可以拆分表空间。
支持事务
行级锁定
读写堵塞与事务隔离级别
高效缓存,支持大内存分配
支持分区,表空间
Innodb调优:
1.避免全表扫描
2.尽量不要使用autocommit自动提交
3.合理设置innodb_flush_log_trx_commit参数值。
4.调整innodb_buffer_pool_size缓存大小
Innodb分表空间:
[mysqld]
Innodb_file_per_table
innodb_data_home_dir = /hoem/mysql/app/3306/data

修改库引擎:
一个库可以支持不同的引擎
1、alter table t1 enginer=innoeb;
2、mysql_convert_table_format -uroot -pckf77856 -S /home/mysql/app/3306/mysql.sock -e MyISAM test t1
HeartBeat高可用介绍:
Hearbeat和keepalived区别
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);
Heartbeat是基于主机或网络的服务的高可用方式;
keepalived的目的是模拟路由器的双机
heartbeat的目的是用户service的双机
lvs的高可用建议用keepavlived
业务的高可用用heartbeat
keepalived主要控制IP飘移,配置应用简单,而且分层,layer3,4,5,各自配置极为简单
heartbeat不但可以控制IP飘移,更擅长对资源服务的控制,配置,应用比较复杂
简介:
通过heartBeat可以将一台故障机器资源转移到另外一台机器。在热备服务器配置heartbeat守护程序来监听主服务器的心跳信息;如果备库 接收不到主库的心跳信息,就会启动故障转移,接替主库急需对外提供服务,从而达到高可用。heartbeat支持主备模式,主主模式。
heartbeat是服务器级别的高可用,非应用级别高可用;
Heartbeat工作原理
通过修改Heartbeat的配置文件,可以指定哪台Heartbeat服务器作为主服务器,则另一台服务器自动成为热备服务器,然后在热备服务器上配置Heartbeat守护程序来监听来自主服务器的心跳消息。如果热备服务器在指定的时间内未监听到来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源及服务高可用性的目的。
以上描述是heartbeat主备的模式,heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的心跳报文,那么,一方就会认为对方失效或者宕机了,这每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续为用户提供服务。一般情况下,可以较好的实现一台主机故障后,企业业务仍能不间断的持续运行。注意:所谓的业务不间断,在故障转移期间也是需要切换时间的<例如:停止数据库及存储服务等>heartbeat的主备高可用的切换时间一般是在5-20秒左右(服务器宕机的切换比人工切换要快)
另外,和keepalived高可用软件一样,heartbeat高可用是操作系统级别的,不是服务(软件)级别的,可以通过简单的脚本控制,实现服务级别的高可用
高可用服务器切换的常见场景:
1)主服务器物理宕机(硬件损坏,操作系统故障),主要解决目标
2)Heartbeat服务软件本身故障
3)两台主备服务器之间心跳连接故障
服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉

常见切换条件:
1.服务器故障
2.heartbeat股在哪个
3.心跳故障
heartbeat心跳线:串口、网卡直连、以太网
防止脑裂措施:
1.同时准备两条心跳线
2.检测到脑裂强制关闭一个心跳节点(需要fence设备,类似智能电源管理设备,内部fence设备有hp的ILO,IBM的RSAII,DELL的iDRAC)。
3.启用磁盘锁
4.监控脑裂实时报警
5.提前预警,延迟接管
6.增加仲裁策略
heardbeat工作依赖消息,类型有:
1.心跳消息(150字节数据包,控制心跳频率及切换时间)
2.集群转消息(分为ip-request,ip-request-resp;主服务器恢复在线,通过ip-request消息要求备机释放资源;当备机释放资源后会通过ip-request_resp消息通知主机,主机提供对外服务),
3.重传消息
heartbeat是通过ip地址接管和arp广播来进行故障转移的。
arp广播:在主机故障时,备机接管服务,会立即强制更新所有客户端本地的arp表,确保客户端能正确连接到服务。虽然客户端任然使用vip连接服务,但是客户端本地的arp表对应的vip 物理MAC地址发生变化。工作中尽量使用vip对外提供连接服务,ifcofnig eth0:1 192.168.52.103/24 up;
默认配置文件目录/etc/ha.d ,分为ha.cf,authkeys(对端认证),haResources(ip资源及脚本程序);资源目录 /etc/ha.d/resource.d/。
应用场景:前端web服务器,后端数据库服务器,后端存储。前端web服务器可有选择keeplive+lvs组合,也可以选用nginx/haproxy和heartbeat组合。
数据库服务器如果是多从的环境建议使用heartbeat,如果只有多主可以使用keeplive。

原创粉丝点击