MySQL配置学习

安装与配置

使用apt 安装 mysqlapt install mysql,其中二进制文件放置在/usr/bin/mysql,配置文件在/etc/mysql
打开配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf,可以看到默认的参数设置:

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc-messages-dir = /usr/share/mysql

对应了mysql启动的一些参数。

在这里进行一些修改,使其能够通过外部ip进行访问:

  • 注释掉bind-address,或者修改为0.0.0.0
  • 本地进入mysql后选择mysql库,执行update user set host='%' where user='root';,使root用户可以在任何地方登陆
  • 重启mysql service mysql restart

引擎

InnoDB

InnoDB是MySQL的默认引擎,主要拥有以下几个功能:

  • ACID事务
  • 存储过程
  • 视图
  • 行级锁定
  • 支持外键

应用场景:

  • 以INSERT、UPDATE为主的应用。
  • 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
  • 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
  • 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
  • 外键约束。MySQL支持外键的存储引擎只有InnoDB。

注意点:

  • 对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务。
  • InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
  • 行级锁只在涉及对索引字段操作的情况下,其余情况都会锁全表。

MyISAM

  • 相比于InnoDB,MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持。
  • 如果执行大量的SELECT,MyISAM是更好的选择。
  • AUTO_INCREMENT性能上MyISAM更快,并且支持复合主键自增。
  • MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

区别

  • InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  • InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  • Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

主从同步

主服务器配置

首先修改主从服务器的配置文件

vim /etc/mysql/mysql.conf.d/mysqld.cnf
server-id               = 128 #这个通常设置为ip最后一段
log_bin                 = /var/log/mysql/mysql-bin.log #二进制文件路径
binlog_do_db            = test_copy #设置要同步的数据库

在主服务器上添加一个sync用户用于从数据库访问
GRANT REPLICATION SLAVE ON *.* to 'sync'@'%' identified by 'sync_pass';
然后重启服务器
使用SHOW MASTER STATUS查看主服务器状态:

+------------------+------------+----------------+--------------------+---------------------+
| File             |   Position | Binlog_Do_DB   | Binlog_Ignore_DB   | Executed_Gtid_Set   |
|------------------+------------+----------------+--------------------+---------------------|
| mysql-bin.000002 |        154 | test_copy      |                    |                     |
+------------------+------------+----------------+--------------------+---------------------+

从服务器配置

修改配置:

server-id=1

然后配置同步参数

change master to MASTER_HOST='192.168.88.128', MASTER_USER='sync',MASTER_PASSWORD='sync_pass';

启动从数据库服务

START SLAVE
SHOW SLAVE STATUS\G
***************************[ 1. row ]***************************
Slave_IO_State                | Waiting for master to send event
Master_Host                   | 192.168.88.128
Master_User                   | sync
Master_Port                   | 3306
Connect_Retry                 | 60
Master_Log_File               | mysql-bin.000002
Read_Master_Log_Pos           | 154
Relay_Log_File                | DESKTOP-0ODM788-relay-bin.000002
Relay_Log_Pos                 | 320
Relay_Master_Log_File         | mysql-bin.000002
Slave_IO_Running              | Yes
Slave_SQL_Running             | Yes

这里的关键点为Slave_IO_RunningSlave_SQL_Running都需要为Yes,一个为No则未配置成功。
如需修改从服务器的配置需要先停掉同步STOP SLAVE,然后使用change master to master_log_file='mysql-bin.000002',master_log_pos=154;进行修改。

确认同步成功:
主服务器执行

mysql root@localhost:test_copy> select * from t_test
+-----------+
|   test_id |
|-----------|
|      1111 |
+-----------+

从服务器执行

mysql (none)@localhost:test_copy> select * from t_test
+---------+
| test_id |
+---------+
| 1111    |
+---------+

主服务器执行插入操作

mysql root@localhost:test_copy> INSERT INTO t_test VALUES (1)
Query OK, 1 row affected
Time: 0.011s

从服务器查询

mysql (none)@localhost:test_copy> select * from t_test
+---------+
| test_id |
+---------+
| 1111    |
| 1       |
+---------+
2 rows in set

数据备份

使用mysqldumps进行数据备份操作:

mysqldump -uroot --all-databases >/tmp/all.sql #导出所有数据库
mysqldump -uroot --databases dbname1 dbname2 >/tmp/all.sql #导出特定的数据库

数据恢复mysql -u root -p <backup.sql
或者登陆到数据库后使用source backup.sql进行还原

分区表

分区类型

  • RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
  • LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  • HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。
  • KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
  • 复合分区:基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。

使用RANGE进行分区

CREATE TABLE t5(id INT,dt DATETIME NOT NULL)
PARTITION BY RANGE (TO_DAYS(dt)) (
    PARTITION p0 VALUES LESS THAN (TO_DAYS('2017-09-01')),
    PARTITION p1 VALUES LESS THAN (TO_DAYS('2017-10-01')),
    PARTITION p2 VALUES LESS THAN (TO_DAYS('2017-11-01')),
    PARTITION p3 VALUES LESS THAN MAXVALUE);

Range需要分区字段为int

使用LIST进行分区

CREATE TABLE t_partition_range(id INT NOT NULL ,number INT NOT NULL)
PARTITION BY LIST(number)(
    PARTITION p0 VALUES IN  (1),
    PARTITION p1 VALUES IN  (2),
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容