MariaDB安装方式: 包管理器(rpm, deb) 通用二进制格式; 源码编译安装; SQL: 数据库、表、索引、视图、存储过程、存储函数、触发器、事件调度器、用户和权限; 元数据数据库:库名为mysql MYSQL语句:有2种 DDL, DML DDL: CREATE, ALTER, DROP DML: INSERT, DELETE, UPDATE, SELECT DCL: GRANT(授权), REVOKE(撤销授权) MariaDB程序的组成:C/S架构 C:Client mysql:CLI交互式客户端程序; mysqldump:逻辑备份工具; mysqladmin:管理工具; mysqlbinlog:查看二进制日志的工具; mysql如何修改root用户的密码

方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:mysql> set password for root@localhost = password('123');

方法2:用mysqladmin 格式:mysqladmin -u用户名 -p旧密码 password 新密码 例子:mysqladmin -uroot -p123456 password 123

方法3:用UPDATE直接编辑user表 首先登录MySQL。 mysql> use mysql; mysql> update user set password=password('123') where user='root' and host='localhost'; mysql> flush privileges;

方法4:在忘记root密码的时候,可以这样 以windows为例:

  1. 关闭正在运行的MySQL服务。
  2. 打开DOS窗口,转到mysql\bin目录。
  3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证。
  4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
  5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
  6. 连接权限数据库: use mysql; 。
  7. 改密码:update user set password=password("123") where user="root";(别忘了最后加分号) 。
  8. 刷新权限(必须步骤):flush privileges; 。
  9. 退出 quit。
  10. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。 1、ps aux | grep mysql:查看是否运行mysqld_safe为服务端程序 2、mysql -e 'SHOW DATABASES;':执行一次数据库命令,回到bash命令行 3、CREATE SCHEMA IF NOT EXISTS testdb; 创建名为testdb的数据库,且如果不存在就创建 4、查看支持的所有字符集:SHOW CHARACTER SET 查看支持的所有排序规则:SHOW COLLATION 5、ALTER TABLE students ADD class VARCHAR(100) NOT NULL; 在students表中添加class字段,类型为可变长字段、长度最大100个字节、此字段不能为空; 6、ALTER TABLE students DROP class; 删除表中的class字段 7、ALTER TABLE students ADD class VARCHAR(100) NOT NULL AFTER name; 指定把class字段添加在name字段后面> DESC students; 查看表的字段 8、 ALTER TABLE students MODIFY class VARCHAR(100) AFTER age;把class字段改在age字段后面 9、ALTER TABLE students DROP PRIMARY KEY; 删除主键 10、ALTER TABLE students ADD UNIQUE KEY (name); 添加name字段为主键,如果此字段要求不能为空,则字段变为唯一键 11、SHOW INDEX FROM students; 查看tudents表中索引信息 12、ALTER TABLE students DROP INDEX name; 删除students表中索引名为name 13、ALTER TABLE students ADD INDEX class (class); 添加字段class的索引为class,索引名和字段名可相同 14、DROP TABLE students; 删除表studnets 15、索引有两种类型,一种是树状是索引,一种是hash索引;mysql使用的是btree索引,b树索引也叫平衡树;b树索有3种:b-树,b树,b+树;mysql用的是b+树; 16、 CREATE INDEX name_and_class ON students (name,class); 添加name和class为索引, DROP INDEX name_and_class ON students; 删除索引; 17、SELECT id,name FROM students; 查看指定字段;即投影 18、SELECT * FROM students; 从students表中查看所有字段 19、 SELECT id as stuID,name FROM students; 显示时把id字段显示为别名为stuID 20、SELECT * FROM students WHERE id=1; 查询表中,id=1的所有信息 21、SELECT name,age FROM students WHERE age > 30 and age < 80; 组合条件查询;

SELECT name,age FROM students WHERE age >= 30 and age =< 80; 显示age和name字段,且符合age的条件; SELECT name,age FROM students WHERE age BETWEEN 30 and 80; 同上,between..and表示范围区间 22、SELECT name FROM students WHERE name LIKE '%n%'; 使用mysql中的模式匹配查看name中包含n的字段 23、SELECT name FROM students WHERE name RLIKE '^.n.$'; 使用正则式模式匹配;查询结果同上 24、SELECT name,age FROM students WHERE age IS NULL; 查询age字段为空,只显示name和age字段 25、SELECT id,name FROM students ORDER BY name; 根据name字段排序,默认为升序,只显示id和name字段 26、SELECT id,name FROM students ORDER BY name DESC; 根据name降序排序 27、DELETE FROM students ORDER BY age DESC LIMIT 20; 删除age最大的前20个用户的行; 28、SELECT name,age FROM students WHERE name NOT LIKE 'stu%'; 查找name,age字段,name不是stu开头的字段的行 29、UPDATE students SET age=age-5 WHERE name NOT LIKE 'stu%';查找name字段,不是stu开头的字段,age-5 30、UPDATE students SET age=age-5 ORDER BY id DESC LIMIT 5; 只改id最大的前5个用户,把age字段-5 用户账号及权限管理: db_name.tbl_name:库名.表名; .:所有库的所有表; db_name.*:指定库的所有表; db_name.tbl_name:指定库的特定表; db_name.routine_name:指定库上的存储过程或存储函数; 如果db_name与routine_name同名,只能靠object_type来区别; 31、CREATE USER 'testuser'@'172.18.%.%.' IDENTIFIED BY 'testpass'; 创建用户testuser,密码为testpass; > FLUSH PRIVILEGES; 刷新授权表 32、GRANT SELECT ON testdb.students TO 'testuser'@'172.18.%.%'; 授权testuser用户有SELECT权限,对testdb库中的students表 FLUSH PRIVILEGES; 刷新授权 33、REVOKE INSERT ON mydb.students FROM 'testuser'@'172.18.%.%'; 回收INSERT授权 34、授权时不影响原来的权限;授权是累加的 SHOW GRANTS FOR 'testuser'@'172.18.%.%'; 查看指定用户的授权; SHOW GRANTS FOR CURRENT_USER; 查看当前用户的权限; 35、 SELECT Host,User,Password FROM user; 查看系统安装后会有2个匿名用户;且root用户密码为空;是不安全的 36、mysql_secure_installation运行 确定输入密码;回车 输入y,密码为root,再确认密码为root; Remove anonymous users? [Y/n] y 是否删除数据库匿名用户 Disallow root login remotely? [Y/n] n 是否禁止管理员root远程登录 Remove test database and access to it? [Y/n] n 是否移除test库 Reload privilege tables now? [Y/n] y 是否重载授权 二进制日志部分: 37、查看二进制日志是否开启: 38、查看二进制日志文件列表: 39、查看二进制日志的记录模式: 40、查看二进制日志文件的内容:show binlog events in “二进制日志文件名” 41、从指定位置查看二进制日志: 42、只显示二进制日志的前三行: 43、从第一行之后开始显示,只显示之后的2行: 44、从245位置之后的第一行开始显示,显示2行: 45、查看当前在使用哪一个二进制日志,以及二进制日志记录到哪个位置了: 二进制日志是会滚动的,当单个二进制日志达到指定大小时,就会滚动,使用flush logs命令即可滚动,重启mysql服务也会自动滚动, 46、在文件系统中使用“ mysqlbinlog ”查看对应的二进制日志: 红色标注是固定的开头内容:版本属性信息,蓝色标志是要查询的信息, mysql中常见的备份工具: 47、从某处开始,到某处结束,查看该区间的二进制日志文件: mysqlbinlog --start-position 317 --stop-position 442 mybinlog.000001 48、从指定的时间开始查看,到指定的时间结束,例:查询2019年2月1日12点20分以后的日志: mysqlbinlog --start-datetime "2019-2-1 12:20:00" --stop-datetime "2019-2-1 12:30:00" mysqlbinlog 000001 49、利用 select 导出a表数据到/testdir/a.backup中 select * from a into outfile ‘/testdir/a.backup’; 50、利用a.backup文件恢复a表内容,先创建一张新表,使用load data将a.backup中的数据导入到新表: create table b(id int); load data infile "/testdir/a.backup" into table b; 51、mysqldump是mysql自带的备份工具,它是一种逻辑备份工具,它会将数据从数据库读出,转化为对应的sql的语句,mysqldump能够实现完全备份或部分备份。使用innodb表类型的表能够使用mysqldump进行热备,使用myisam表类型的表只能使用mysqldump进行温备。 52、xtrabackup支持对innodb存储引擎做热备,是一种物理备份工具,性能强悍,支持完全备份、差异备份、增量备份、部分备份、 53、不是rpm包安装的mysql,启动及关闭: 启动:/usr/bin/mysqld_safe & 关闭:mysqladmin -uroot shutdown 54、查看字符集相关的全局设置: show global variables where variables_name like 'character%' 55、查看会话级别的变量并用set修改: 56、将tb1表中id号为13的行中的name字段的值改为Luffy: update tb1 set name="luffy" where id=13; 存储引擎: 57、mysql中,存储引擎是插件式的,同一个数据库中的不同的表可以使用不同的存储引擎,也被称为“表类型”, 58、查看默认的存储引擎:show engines; 59、一次性查看某个数据库中所有表中都使用哪些存储引擎:students和t1都用innodb的存储引擎: 60、在创建表时就指定当前表使用哪种存储引擎: 61、删除用户:delete from mysql.user where user='wpuser' and host='192.168.151.%'; 62、将用户root的密码改为空: update mysql.user set password='' where user='root'; 63、创建/删除数据库: create/drop database name; 64、清除指定二进制日志:purge binary logs to 'mariadb-bin.000003';删除3之前的日志

存储过程: 存储过程优势 存储过程把经常使用的SQL语句或业务逻辑封装起来,预编译保存在数据库中, 当需要时从数据库中直接调用,省去了编译的过程 提高了运行速度 同时降低网络数据传输量 存储过程与自定义函数的区别 存储过程实现的过程要复杂一些,而函数的针对性较强 存储过程可以有多个返回值,而自定义函数只有一个返回值 存储过程一般独立的来执行,而函数往往是作为其他SQL语句的一部分来使用 触发器示例 CREATE TABLE student_info ( stu_id INT(11) NOT NULL AUTO_INCREMENT, stu_name VARCHAR(255) DEFAULT NULL, PRIMARY KEY (stu_id) ); CREATE TABLE student_count ( student_count INT(11) DEFAULT 0 ); INSERT INTO student_count VALUES(0); 触发器示例 示例:创建触发器,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少 CREATE TRIGGER trigger_student_count_insert AFTER INSERT ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count+1; CREATE TRIGGER trigger_student_count_delete AFTER DELETE ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count-1; 查看触发器:SHOW TRIGGERS 删除触发:DROP TRIGGER trigger_name; MySQL用户和权限 用户管理: 创建用户:CREATE USER CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password']; 默认权限:USAGE 用户重命名:RENAME USER RENAME USER old_user_name TO new_user_name; 删除用户: DROP USER 'USERNAME'@'HOST‘ 示例:删除默认的空用户 DROP USER ''@'localhost'; 修改密码: mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password'); mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause; 此方法需要执行下面指令才能生效: mysql> FLUSH PRIVILEGES; #mysqladmin -u root -poldpass password ‘newpass’ 忘记管理员密码的解决办法: 启动mysqld进程时,为其使用如下选项: --skip-grant-tables --skip-networking 使用UPDATE命令修改管理员密码 关闭mysqld进程,移除上述两个选项,重启mysqld 授权: GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host'[IDENTIFIED BY 'password'] [WITH GRANT OPTION]; 回收授权: REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... 示例:REVOKE DELETE ON testdb.* FROM 'testuser'@‘172.16.0.%’; 重读授权表:mysql> FLUSH PRIVILEGE 存储引擎: MyISAM引擎特点 不支持事务、表级锁定、读写相互阻塞,写入不能读,读时不能写、只缓存索引、不支持外键约束、不支持聚簇索引、读取数据较快,占用资源较少、不支持MVCC(多版本并发控制机制)高并发、崩溃恢复性较差、MySQL5.5.5前默认的数据库引擎 查看mysql支持的存储引擎:show engines; 查看当前默认的存储引擎:show variables like '%storage_engine%'; 设置默认的存储引擎 vim /etc/my.conf [mysqld] default_storage_engine= InnoDB 查看库中指定表的存储引擎 show table status like ' tb_name '; show create table tb_name; 设置表的存储引擎: CREATE TABLE tb_name(... ) ENGINE=InnoDB; ALTER TABLE tb_name ENGINE=InnoDB 服务器端设置 服务器系统变量:分全局和会话两种 获取系统变量 mysql> SHOW GLOBAL VARIABLES; mysql> SHOW [SESSION] VARIABLES; mysql> SELECT @@VARIABLES; 修改服务器变量的值:mysql> help SET 修改全局变量:仅对修改后新创建的会话有效;对已经建立的会话无效 mysql> SET GLOBAL system_var_name=value; mysql> SET @@global.system_var_name=value; 修改会话变量:mysql> SET [SESSION] system_var_name=value; mysql> SET @@[session.]system_var_name=value; 服务器状态变量: 分全局和会话两种 状态变量(只读):用于保存mysqld运行中的统计数据的变量,不可更改 mysql> S:HOW GLOBAL STATUS; mysql> SHOW [SESSION] STATUS; 查询缓存 QUERY cache: 优缺点 不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从 Query Cache中获得查询结果,提高查询性能 查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低其效率; 查询缓存的使用,会增加检查和清理Query Cache中记录集的开销 查询缓存相关的服务器变量 query_cache_min_res_unit:查询缓存中内存块的最小分配单位,默认4k,较 小值会减少浪费,但会导致更频繁的内存分配操作,较大值会带来浪费,会导 致碎片过多,内存不足 query_cache_limit:单个查询结果能缓存的最大值,默认为1M,对于查询结 果过大而无法缓存的语句,建议使用SQL_NO_CACHE query_cache_size:查询缓存总共可用的内存空间;单位字节,必须是1024 的整数倍,最小值40KB,低于此值有警报 query_cache_wlock_invalidate:如果某表被其它的会话锁定,是否仍然可以 从查询缓存中返回结果,默认值为OFF,表示可以在表被其它会话锁定的场景 中继续从缓存返回数据;ON则表示不允许 query_cache_type:是否开启缓存功能,取值为ON, OFF, DEMAND InnoDB存储引擎 查看状态:show global status like 'innodb%read%'\G 索引:是特殊数据结构,定义在查找时作为查找条件的字段,在MySQL又称为键key,索引通过存储引擎实现 优点:索引可以降低服务需要扫描的数据量,减少了IO次数索引可以帮助服务器避免排序和使用临时表索引可以帮助将随机I/O转为顺序I/O 缺点:占用额外空间,影响插入 索引类型: B+ TREE、HASH、R TREE Hash索引 Hash索引:基于哈希表实现,只有精确匹配索引中的所有列的查询才有效,索 引自身只存储索引列对应的哈希值和数据指针,索引结构紧凑,查询性能好 Memory存储引擎支持显式hash索引,InnoDB和MyISAM存储引擎不支持 适用场景:只支持等值比较查询,包括=, <=>, IN() 不适合使用hash索引的场景 不适用于顺序查询:索引存储顺序的不是值的顺序 不支持模糊匹配 不支持范围查询 不支持部分索引列匹配查找:如A,B列索引,只查询A列索引无效 索引优化建议 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值, 此列在使用时也不会使用索引 尽量使用短索引,如果可以,应该制定一个前缀长度 对于经常在where子句使用的列,最好设置索引 对于有多个列where或者order by子句,应该建立复合索引 对于like语句,以%或者‘-’开头的不会使用索引,以%结尾会使用索引 尽量不要在列上进行运算(函数操作和表达式操作) 尽量不要使用not in和<>操作 并发控制 锁粒度:表级锁 行级锁 锁: 读锁:共享锁,只读不可写(包括当前事务),多个读互不阻塞 写锁:独占锁,排它锁,写锁会阻塞其它事务(不包括当前事务)的读和它锁 实现 存储引擎:自行实现其锁策略和锁粒度 服务器级:实现了锁,表级锁,用户可显式请求 分类: 隐式锁:由存储引擎自动施加锁 显式锁:用户手动请求 LOCK TABLES 加锁 UNLOCK TABLES 解锁 事务 事务Transactions:一组原子性的SQL语句,或一个独立工作单元 事务日志:记录事务信息,实现undo,redo等故障恢复功能 启动事务:BEGIN BEGIN WORK START TRANSACTION 结束事务: COMMIT:提交 ROLLBACK: 回滚 注意:只有事务型存储引擎中的DML语句方能支持此类操作 自动提交:set autocommit={1|0} 默认为1,为0时设为非自动提交 建议:显式请求和提交事务,而不要使用“自动提交”功能 事务隔离级别 事务隔离级别:从上至下更加严格 READ UNCOMMITTED 可读取到未提交数据,产生脏读 READ COMMITTED 可读取到提交数据,但未提交数据不可读,产 生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致 REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即 读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改 前的旧数据。此为MySQL默认设置 SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未 提交的修改事务阻塞读事务。导致并发性能差 MVCC: 多版本并发控制,和事务级别相关 指定事务隔离级别: 服务器变量tx_isolation指定,默认为REPEATABLE-READ,可在GLOBAL和 SESSION级进行设置 SET tx_isolation='' READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE 服务器选项中指定 vim /etc/my.cnf [mysqld] transaction-isolation=SERIALIZABLE 日志 事务日志 transaction log、错误日志 error log、通用日志 general log、慢查询日志 slow query log、二进制日志 binary log、中继日志 reley log 错误日志 错误日志 mysqld启动和关闭过程中输出的事件信息 mysqld运行中产生的错误信息 event scheduler运行一个event时产生的日志信息 在主从复制架构中的从服务器上启动从服务器线程时产生的信息错误日志相关配置 SHOW GLOBAL VARIABLES LIKE 'log_error' 错误文件路径 log_error=/PATH/TO/LOG_ERROR_FILE 是否记录警告信息至错误日志文件log_warnings=1|0 默认值1 通用日志 通用日志:记录对数据库的通用操作,包括错误的SQL语句 文件:file,默认值 表:table 通用日志相关设置 general_log=ON|OFF general_log_file=HOSTNAME.log log_output=TABLE|FILE|NONE 慢查询日志 慢查询日志:记录执行查询时长超出指定时长的操作 slow_query_log=ON|OFF 开启或关闭慢查询 long_query_time=N 慢查询的阀值,单位秒 slow_query_log_file=HOSTNAME-slow.log 慢查询日志文件 二进制日志 二进制日志 记录导致数据改变或潜在导致数据改变的SQL语句记录已提交的日志不依赖于存储引擎类型 功能:通过“重放”日志文件中的事件来生成数据副本 注意:建议二进制日志和数据文件分开存放 中继日志:relay log主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件 二进制日志记录三种格式 基于“语句”记录:statement,记录语句,默认模式 基于“行”记录:row,记录数据,日志量较大 混合模式:mixed, 让系统自行判定该基于哪种方式进行 日志文件:mysql|mariadb-bin.文件名后缀,二进制格式 如: mariadb-bin.000001 索引文件:mysql|mariadb-bin.index,文本格式 二进制日志相关配置 查看mariadb自行管理使用中的二进制日志文件列表,及大小 SHOW {BINARY | MASTER} LOGS 查看使用中的二进制日志文件 SHOW MASTER STATUS 查看二进制文件中的指定内容 示例:show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3 mysqlbinlog:二进制日志的客户端命令工具 mysqlbinlog --start-position=6787 --stop-position=7527 清除指定二进制日志: PURGE BINARY LOGS TO ‘mariadb-bin.000003’;删除3之前的日志 PURGE BINARY LOGS BEFORE '2017-01-23'; PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30'; 删除所有二进制日志,index文件重新记数 RESET MASTER [TO #]; 删除所有二进制日志文件,并重新生成日志文件,文件名从#开始记数,默认从1开始,一般是master主机第一次启动时执行,MariaDB10.1.6开始支持TO # 切换日志文件:FLUSH LOGS; 增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂 差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单 注意:二进制日志文件不应该与数据文件放在同一磁盘 备份和恢复 mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份 xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量 xtrabackup: percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具 特点: 备份还原过程快速、可靠 备份过程不会打断正在执行的事务 能够基于压缩等功能节约磁盘空间和流量 自动实现备份检验 开源,免费 xtrabackup单表导出和导入 1 单表备份 innobackupex --include='hellodb.students' /backups 2备份表结构 mysql -e 'show create table hellodb.students' > student.sql 3删除表 mysql -e 'drop table hellodb.students‘ 4 innobackupex --apply-log --export /backups/2018-02-23_15-03-23/ 5 创建表 mysql>CREATE TABLE students ( StuID int(10) unsigned NOT NULL AUTO_INCREMENT, Name varchar(50) NOT NULL, Age tinyint(3) unsigned NOT NULL, Gender enum('F','M') NOT NULL, ClassID tinyint(3) unsigned DEFAULT NULL, TeacherID int(10) unsigned DEFAULT NULL, PRIMARY KEY (StuID) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 6 删除表空间 alter table students discard tablespace; 7 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/ 8 chown -R mysql.mysql /var/lib/mysql/hellodb/ 9 mysql>alter table students import tablespace; MySQL复制 主节点配置: (1) 启用二进制日志 [mysqld] log_bin (2) 为当前节点设置一个全局惟一的ID号 [mysqld] server_id=# log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名 (3) 创建有复制权限的用户账号 GRANT REPLICATION SLAVE ON . TO 'repluser'@'HOST' IDENTIFIED BY 'replpass'; 从节点配置: (1) 启动中继日志 [mysqld] server_id=# 为当前节点设置一个全局惟的ID号 read_only=ON 设置数据库只读 relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin relay_log_index=relay-log.index 默认值hostname-relay-bin.index (2) 使用有复制权限的用户账号连接至主服务器,并启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE=' mariadb-bin.xxxxxx', MASTER_LOG_POS=#; mysql> START SLAVE [IO_THREAD|SQL_THREAD]; 如果要启用级联复制,需要在从服务器启用以下配置 [mysqld] log_bin log_slave_updates 主主复制:互为主从 容易产生的问题:数据不一致;因此慎用考虑要点:自动增长id配置一个节点使用奇数idauto_increment_offset=1 开始点auto_increment_increment=2 增长幅度另一个节点使用偶数idauto_increment_offset=2auto_increment_increment 主主复制的配置步骤: (1) 各节点使用一个惟一server_id (2) 都启动binary log和relay log (3) 创建拥有复制权限的用户账号 (4) 定义自动增长id字段的数值范围各为奇偶 (5) 均把对方指定为主节点,并启动复制线程 Galera Cluster: Galera Cluster特点 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失 并发复制:从节点APPLY数据时,支持并行执行,更好的性能 故障切换:在出现数据库故障时,因支持多点写入,切换容易 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致 对应用透明:集群的维护,对应用程序是透明的