192.168.68.160、192.168.68.162 互为主从关系
192.168.68.163、192.168.68.164 从库
安装数据库:
yum install mariadb mariadb-server -y
修改my.cnf配置文件:
vim /etc/my.cnf
server-id=1 #每台数据库的id不能相同!!
log-bin=mysql-bin
relay-log=relay-log
开启数据库:
systemctl enable mariadb #开机自启
systemctl start mariadb #启动
在192.168.68.160、192.168.68.162:操作互为主从
mysql 中查看 mysql 二进制日志信息并授权:
192.168.68.160部署:
MariaDB [(none)]> show master status;
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mysql-bin.00004 | 245 | | |
+-----------------+----------+--------------+------------------+
MariaDB [(none)]> grant all on *.* to lzg@'%' identified by '123456'; '
MariaDB [(none)]> stop slave;
MariaDB [(none)]> change master to master_host='192.168.68.162',master_user='lzg',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=255;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status \G;
显示下方为双Yes则主从配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
192.168.68.162 部署:
MariaDB [(none)]> show master status;
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| mysql-bin.00003 | 255 | | |
+-----------------+----------+--------------+------------------+
MariaDB [(none)]> grant all on *.* to lzg@'%' identified by '123456'; '
MariaDB [(none)]> stop slave;
MariaDB [(none)]> change master to master_host='192.168.68.100',master_user='lzg',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=245;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status \G;
显示下方为双Yes则主从配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
部署高可用:keepalived
yum install keepalived -y
修改keepalived.conf配置文件:
! Configuration File for keepalived
global_defs {
# Keepalived process identifier
lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_mysql {
script "pidof mysqld"
interval 2
weight 20}
# Virtual interface br-OAM
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance mysql {
state BACKUP
interface ens33
virtual_router_id 98
priority 10
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
192.168.68.100/24
}
track_script {
check_mysql
}
}
启动keepalived:
systemctl enable keepalived #开机自启
systemctl start keepadived #启动
测试是否成功启动VIP:
inet 192.168.68.100/24 scope global secondary ens33
安装部署从库: 192.168.68.163、192.168.68.164
yum install mariadb mariadb-server -y
修改 my.cnf 配置文件:
vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
relay-log=relay-log
启动数据库:
systemctl enable mariadb #开机自启
systemctl start mariadb #启动
在192.168.68.163、192.168.68.164 mysql 授权:
MariaDB [(none)]> stop slave;
MariaDB [(none)]> change master to master_host='192.168.68.100',master_user='lzg',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=245;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status \G;
显示下方为双Yes则主从配置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
开启mysql查询缓存:
方法一:{ 修改配置文件:
vim /etc/my.cnf
[mysqld]
query_cache_type = 1
query_cache_size = 100000
}
修改之后需要重启mysql才能生效。
方法二:{ Sql命令式修改
mysql> set global query_cache_type=1;
mysql> set global_cache_size=200000;<br>mysql> show variables like '%query_cache%';
+-------------------------------+---------+
| Variable_name | Value |
+-------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 199680 |
| query_cache_type | NO |
| query_cache_wlock_invalidate | OFF |
+-------------------------------+---------+
}
mysql> show variables like '%query_cache%';
+-------------------------------+---------+
| Variable_name | Value |
+-------------------------------+---------+
| have_query_cache | YES |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 199680 |
| query_cache_type | NO |
| query_cache_wlock_invalidate | OFF |
+-------------------------------+---------+
数据库慢查询日志:
修改参数:
# vi /etc/my.cnf
[mysqld]
slow_query_log = 1
long_query_time = 1
# service mysqld restart
临时配置开启:
mysql> set global slow_query_log='ON';
设置日志存放目录:
mysql> set slow_query_log_file='/var/lib/mysql/mysql-slow.log';
设置时间:
mysql> set long_query_time=0.1;
查看具体信息:
mysql> show variables like '%quer%';
+-------------------------------+---------------------------------+
| Variable_name | Value |
+-------------------------------+---------------------------------+
| ft_query_expansion_limit | 20 |
| have_query_cache | YES |
| log_queries_not_using_indexes | OFF |
| log_slow_queries | OFF |
| long_query_time | 0.100000 |
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
| slow_query_log | OFF |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+-------------+-----------------+---------------------------------+
可以使用mysqldumpslow进行分析对慢查询日志。或者直接cat等进行查看!!!!
验证:
mysql> select sleep(10);
之后去存储日志目录查看是否生成即可。
修改数据库字符集:
#查看当前数据库所支持的字符集:
mysql> show charset;
#查询当前字符编码:
mysql> show variables like ‘%char%’;
+---------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------+-----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_dayabase | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+-------------+--------------+----------------------------+
参数说明:
character_set_client:客户端请求数据的字符集。
character_set_connection:从客户端接收到数据,然后传输的字符集。
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,使character_set_server指定的字符集,此参数无需设置。
character_set_filesystem:把操作系统上文件名转化成此字符集,即把character_set_client转换character_set_filesystem,默认binary即可。
character_set_results:结果集的字符集。
character_set_server:数据库服务器的默认字符集。
character_set_system:这个值总是utf8,不需要设置,存储系统元数据的字符集。
单独修改当前表的字符集:
mysql> alter table 表名 convert to character set utf8;
查看表的字符集:
mysql> show table status from 库名 like 表名;
查看表中所有列的字符集:
mysql> show full columns from 表名;
设置字符集
设置字符集一般有两种方法,一种是在创建表的时候设置字符集,另一种是表建成之后修改字符集。
创建库的时候指定字符集:
mysql> create database 库名 default character set=字符集;
或者
mysql> create database wg charset utf8;
mysql> create database db2 default character set=utf8;
创建表的时候指定字符集:
mysql> create table 表名(属性) default character set=字符集;
mysql> create table test1(id int(6),name char(10)) default character set = 'gbk';
修改库的字符集:
mysql> alter database 库名 default character set 字符集;
mysql> alter database shiyan default character set gbk;
查看:
mysql> show create database shiyan\G
修改单独库的字符集:
mysql> alter database 数据库名 default character set utf8;
修改表的字符集:
mysql> alter table test1 convert to character set utf8;
查看
mysql> show create table test1\G
修改字段的字符集:
mysql> alter table test1 modify name char(10) character set gbk;
mysql> show full columns from test1;
永久修改方式,修改配置文件修改:
vim /etc/my.cnf
[mysqld]
default-character-set = utf8
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
数据库的原理是:
1、两个线程,一个I/O线程,一个SQL线程, i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;
2、主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;
3、SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
数据库的引擎是啥,有啥区别:
1、MyISAM用一个变量保存了整个表的行数,InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。MylSAM执行上述语句时只需要读出该变量即可,速度很快。
2、MyISAM支持全文索引,Innodb不支持全文索引,查询效率上MyISAM要高。
3、innodb支持事务,MyISAM不支持事务,
4、如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。系统奔溃后,MyISAM恢复起来更困难。
数据库延迟是如何产生的:
复制代码
master可以并发,Slave_SQL_Running线程却不可以。
当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。
TPS : 是一台数据库服务器每秒处理的事务的个数。
DDL:数据库定义语句,用来创建数据库中的表、索引、视图、存储过程、触发器等,常用的语句关键字有:CREATE,ALTER,DROP,TRUNCATE,COMMENT,RENAME。
因素:
1、从库的配置往往没有主库的配置高
2、主库支持并发写入,而5.7之前的版本上从库只有单线程SQL来完成任务。
3、MySQL主从之间的同步,并不是完全的实时同步,而是主库提交事务之后,从库才再来执行一遍
4、主库上的表的某个列没有索引,然后对这个列进行delete或update操作
5、网络问题,往返时延RTT较大。
主库宕机:
1、确保所有的relay log全部更新完毕,在每个从库上执行show processlist
2、更新完毕后,登录所有从库查看master.info文件,对比选择pos最大的作为新的主库,
3、然后登录这个新的主库,执行stop slave;进入主目录,删除master.Info和relay-log.info配置my.cnf文件开启log-bin文件
4、创建用于同步的用户并授权slave
5、登录另外一台从库,执行stop slave停止同步
6、执行start slave
7、修改新的master数据,测试slave是否同步更新
从库宕机:
1、查看从库上mysql的错误日志,里面有记录主从挂掉时的binlog信息。
2、有了binlog和postion信息后,只需要重新在从库上进行change master to配置即可。配置后开启slave状态,没有报错
3、查看slave状态,发现slave已经正常了,开始进行延时数据恢复。
数据库如何调优:
内核优化:根据硬件配置来进行优化 比如内存使用、TCP处理这方面的优化
配置参数的优化:我做过IO处理的常用参数、最大连接数设置、缓存使用参数的设置、慢日志的参数的设置
慢查询日志:
配置慢查询功能的方式有两种,一种是使用mysql的配置文件配置,另外一种是使用mysql命令配置。
配置文件配置:
找到[mysqld],在其下面添加如下代码即可.
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
long_query_time=0 log-queries-not-using-indexes = 1
配置好后,重启mysql服务
使用命令配置:
这里就简单些一个配置项就行了,其他的配置项均按照此方法配置
mysql> set slow_query_log=ON;