安装与配置
使用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_Running
和Slave_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),
);