MySQL的安装及使用
1. DBMS&RDBMS概述
- DBMS:DataBase Management System 数据库管理系统
- RDMAB:Relational DBMS 关系型数据库管理系统
2. MySQL的安装(MariaDB)
2.1 RPM包安装
- 直接yum install 安装即可
yum install mariadb-server mariadb -y
2.2 二进制安装
1)安装MariaDB
yum install libaio # 安装支持异步IO的包 yum -y install numactl groupadd mysql useradd -r -g mysql mysql mkdir -pv /mydata/data # 创建数据目录 cd /usr/local tar zxvf /path/to/mysql-VERSION-OS.tar.gz ln -s full-path-to-mysql-VERSION-OS mysql cd mysql mkdir mysql-files # 注意这里要创建mysql-files文件夹 chmod 770 mysql-files chown -R mysql.mysql . # 这一步会产生临时的root@localhost密码,需要自己记下来 bin/mysqld --initialize --user=mysql --datadir=/mydata/data # 这一步就相当于数据库的初始化了,原本的install_db已经不存在了 bin/mysql_ssl_rsa_setup chown -R root . chown -R mysql /mydata/data mysql-files bin/mysqld_safe --user=mysql --datadir=/mydata/data & cp support-files/mysql.server /etc/init.d/mysqld # 然后要将/usr/local/mysql/bin加入到环境变量中 # 登录完之后要修改密码 set password = '123'; # 最后用chkconfig配置开机自启动 chkconfig mysqld on
说明:
- 如果在mysql_install_db后发现data目录下没有文件或者文件不全,可能是因为/etc/my.cnf存在的缘故,可以将文件改名 mv /etc/my.cnf /etc/my.cnf.old,或者直接将其删除,然后重新mysql_install_db
- 执行 mysqld_safe --user=mysql & 即可启动MySQL
- mysqld_safe是一个守护mysqld进程的脚本程序,旨在mysqld意外停止时,可以重启mysqld进程
- 也可以直接通过 bin/mysqld --user=mysql & 来启动mysql,但是在结束后不会被mysqld_safe重新拉起了,它本身是不会重启的
- 使用 /etc/init.d/mysql.server start进行启动(启动脚本以复制的实际名字为准,通常改名为mysqld,即/etc/init.d/mysqld start)
2)提供配置文件
cp support-files/my-large.cnf /etc/my.cnf # 并在这个配置文件中加三个选项: datadir = /mydata/data # 提供数据目录 innodb_file_per_table = ON # 每个表使用自己专用的表空间存储表的数据和索引 skip_name_resolve = ON # 禁止解析主机名
3)启动服务并加固
service mysqld start # 启动MySQL mysql_secure_installation # 对MySQL的一系列加固措施
4)安装后设定
# 为root用户设定密码 set password update mysql.user set password=PASSWORD('your_pass') where cluase # 删除所有匿名用户 drop user ''@'localhost'; # 上述两步可以用mysql_secure_installation来替代 skip_name_resolve=1 # 关闭主机名反解
- mysql在每一次运行起来以后,是通过把mysql的user表载入内存中以完成用户认证功能的
- 注意要手动去刷新授权表flush privileges
5)用systemctl管理mysql
- 在 /usr/lib/systemd/system/ 下,保存为 mysqld.service
[Unit] Description=MySQL Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf LimitNOFILE = 5000
2.3 对MySQL配置文件的说明
1)配置示例
# 配置文件my.cnf [client] user=david password=88888888 [mysqld] # 这个标签表示是整个MySQL的配置 ########basic settings######## server-id = 11 port = 3306 user = mysql bind_address = 10.166.224.32 # 根据实际情况修改,如果修改成0.0.0.0,即表示允许任何主机登陆 autocommit = 0 # 5.6.X安装时,需要注释掉,安装完成后再打开 character_set_server=utf8mb4 ### 设置好了字符集 skip_name_resolve = 1 max_connections = 800 max_connect_errors = 1000 datadir = /data/mysql_data # 数据库的数据存放目录,根据实际情况修改,建议和程序分离存放(这个文件夹要设置成mysql.mysql的权限) transaction_isolation = READ-COMMITTED explicit_defaults_for_timestamp = 1 join_buffer_size = 134217728 tmp_table_size = 67108864 tmpdir = /tmp max_allowed_packet = 16777216 sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER" interactive_timeout = 1800 wait_timeout = 1800 read_buffer_size = 16777216 read_rnd_buffer_size = 33554432 sort_buffer_size = 33554432 ########log settings######## log_error = error.log # 如果没有配置错误文件的位置和文件名,那么默认的是 机器名.error,配置了这个位置之后,一些输出信息都会被保存到这里 slow_query_log = 1 ### 开启了慢查询日志 slow_query_log_file = slow.log log_queries_not_using_indexes = 1 log_slow_admin_statements = 1 log_slow_slave_statements = 1 log_throttle_queries_not_using_indexes = 10 expire_logs_days = 90 long_query_time = 2 min_examined_row_limit = 100 # 不走索引,直接扫描而不计入慢查询日志的limit ########replication settings######## master_info_repository = TABLE relay_log_info_repository = TABLE log_bin = bin.log sync_binlog = 1 gtid_mode = on enforce_gtid_consistency = 1 log_slave_updates binlog_format = row relay_log = relay.log relay_log_recovery = 1 binlog_gtid_simple_recovery = 1 slave_skip_errors = ddl_exist_errors ########innodb settings######## innodb_page_size = 8192 innodb_buffer_pool_size = 6G #根据实际情况修改 innodb_buffer_pool_instances = 8 innodb_buffer_pool_load_at_startup = 1 innodb_buffer_pool_dump_at_shutdown = 1 innodb_lru_scan_depth = 2000 innodb_lock_wait_timeout = 5 innodb_io_capacity = 4000 innodb_io_capacity_max = 8000 innodb_flush_method = O_DIRECT innodb_file_format = Barracuda innodb_file_format_max = Barracuda innodb_log_group_home_dir = /redolog/ # 根据实际情况修改(可以后面改),这个文件夹要设置为mysql.mysql的权限 innodb_undo_directory = /undolog/ # 根据实际情况修改(设置之后就不能改),这个文件夹要设置为mysql.mysql的权限 innodb_undo_logs = 128 # 这个值建议一开始就确定,否则后面设置比较麻烦 innodb_undo_tablespaces = 3 # 这个值建议一开始就确定,否则后面设置比较麻烦 innodb_flush_neighbors = 1 innodb_log_file_size = 4G # 根据实际情况修改(这个参数非常重要,不能设置太小,初始化的安装是48M,非常不合适) innodb_log_buffer_size = 16777216 innodb_purge_threads = 4 innodb_large_prefix = 1 innodb_thread_concurrency = 64 innodb_print_all_deadlocks = 1 innodb_strict_mode = 1 innodb_sort_buffer_size = 67108864 ########semi sync replication settings######## plugin_dir=/usr/local/mysql/lib/plugin #根据实际情况修改 plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so" loose_rpl_semi_sync_master_enabled = 1 loose_rpl_semi_sync_slave_enabled = 1 loose_rpl_semi_sync_master_timeout = 5000 [mysqld-5.7] # 这个标签是代表这是5.7的单独配置 innodb_buffer_pool_dump_pct = 40 innodb_page_cleaners = 4 innodb_undo_log_truncate = 1 innodb_max_undo_log_size = 2G innodb_purge_rseg_truncate_frequency = 128 binlog_gtid_simple_recovery=1 log_timestamps=system transaction_write_set_extraction=MURMUR32 show_compatibility_56=on
2)对几个重要参数的配置说明
- innodb_log_file_size = 4G
- 做实验可以更改的小点,线上环境推荐用4G,以前5.5和5.1等版本之所以官方给的值很小,是因为太大后有bug,现在bug已经修复
- innodb_undo_logs = 128 和 innodb_undo_tablespaces = 3
- 建议在安装之前就确定好该值,后续修改比较麻烦
- [mysqld],[mysqld-5.7]
- 这种tag表明了下面的配置在什么版本下才生效,[mysqld]下均生效
- autocommit
- 这个参数在5.5.X以后才有,安装5.6.X的时候要注意先把该参数注释掉,等安装完成后,再行打开, 5.7.X无需预先注释
- datadir、innodb_log_group_home_dir、innodb_undo_directory
- 一定要注意它们的权限是 mysql:mysql,
- 因为这些文件都是MySQL运行过程中进行写入的,而mysql在运行过程中都是运行在mysql这个用户权限下的,所以必须要有权限写入
3)my.cnf 的说明
- 使用 mysqld --help -vv | grep my.cnf 查看mysql的配置文件读取顺序
- 后读取的my.cnf中的配置,如果有相同项,会覆盖之前的配置
- 使用 --defaults-files 可以在启动时指定配置文件
2.3 编译安装
- 采用cmake方式编译安装
- 没必要,二进制安装即可
3. MySQL基本使用
3.1 Client端和Server端的程序文件
1)Client端
2)Server端
3.2 MySQL的使用模式
3.3 mysqld的工作特性
3.4 SQL MODE
4. MySQL多实例
4.1 多实例概述
在一台机器上开启多个不同的服务端口(如3306、3307),运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供各自的服务。
这些MySQL多实例公用一套MySQL安装程序,使用不同的(也可以相同)的my.cnf配置文件、启动程序、数据文件。
在提供服务时,多实例MySQL在逻辑上看来是各自独立的。
4.1 单一配置文件部署方案
1)my.cnf 配置示例
[mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin user = multi_admin # 这里需要创建一个关闭MySQL多实例的用户账号 [mysqld1] port = 3306 user = mysql socket = /var/lib/mysql/mysql.sock pid-file = /var/lib/mysql/mysql.pid datadir = /var/lib/mysql [mysqld2] port = 3307 user = mysql socket = /mnt/data/db1/mysql.sock pid-file = /mnt/data/db1/mysql.pid datadir = /mnt/data/db1 skip-name-resolve server-id = 2 default-storage-engine = innodb innodb_buffer_pool_size = 512M innodb_additional_mem_pool = 10M default_character_set = utf8 character_set_server = utf8 #read-only relay-log-space-limit = 3G expire_logs_day = 20 [mysqld3] port = 3308 user = mysql socket = /mnt/data/db2/mysql.sock pid-file = /mnt/data/db2/mysql.pid datadir = /mnt/data/db2 skip-name-resolve server-id = 3 master-connect-retry = 60 default-storage-engine = innodb innodb_buffer_pool_size = 1G innodb_additional_mem_pool = 10M default_character_set = utf8 character_set_server = utf8 read-only relay-log-space-limit = 3G expire_logs_day = 20
- 缺点:单一配置文件部署多实例耦合性太高
2)初始化数据库
/usr/local/mysql/scripts/mysql_install_db --datadir=/var/lib/mysql --basedir=/usr/local/mysql --user=mysql /usr/local/mysql/scripts/mysql_install_db --datadir=/mnt/data/db1 --basedir=/usr/local/mysql --user=mysql /usr/local/mysql/scripts/mysql_install_db --datadir=/mnt/data/db2 --basedir=/usr/local/mysql --user=mysql
3)启动、查看和关闭多实例
# 启动MySQL多实例 mysql_multi --defaults-extra-file=/etc/my_multi.cnf start 1,2,3 # 查看MySQL多实例启动状况 mysql_multi --defaults-extra-file=/etc/my_multi.cnf report 1,2,3 # 关闭MySQL多实例 # 一次关闭多个实例 mysql_multi --defaults-extra-file=/etc/my_multi.cnf stop 1,2,3 # 一次关闭指定的一个实例 mysqladmin -u root -S /mnt/mydata/3307/mysql.sock shutdown
4)登录多实例
# 本机登录多实例 mysql -u root -p -S /data/3308/mysql.sock --prot=3308 # 远程登录多实例 mysql -u root -p --port=3308 -h 10.0.0.202
4.2 多配置文件部署方案
1)创建目录结构
2)修改各个实例的 my.cnf 配置文件
# 只写出了每个实例之间有差异的地方 [client] port = 3307 socket = /multi_mysql/3307/mysql.sock [mysqld] port = 3307 socket = /multi_mysql/3307/mysql.sock datadir = /multi_mysql/3307/data basedir = /usr/local/mysql log-error = /multi_mysql/3307/mysql_3307.err pid-file = /multi_mysql/3307/mysqld.pid server-id = 2 # 这里id号每个实例都要不同
- 修改数据目录的权限
- chown -R mysql.mysql /mydata
- 设置启动文件的执行权限
- 若多实例有各自的启动文件,则启动多实例时,直接启动各个多实例的启动文件即可
- 配置mysql全局使用命令
- 在/etc/profile文件中添加环境变量
3)初始化多实例的数据库文件
./mysql_install_db --basedir=/usr/local/mysql --datadir=/mydata/3306/data --user=mysql
./mysql_install_db --basedir=/usr/local/mysql --datadir=/mydata/3307/data --user=mysql
4)启动、停止多实例
# 启动 mysql_safe --defaults-file=/mydata/3306/my.cnf 2>&1 >/dev/null & mysql_safe --defaults-file=/mydata/3307/my.cnf 2>&1 >/dev/null & # 停止 mysqladmin -u root -phgzero -S /mydata/3306/mysql.sock shutdown mysqladmin -u root -phgzero -S /mydata/3307/mysql.sock shutdown
5)登录多实例
# 为root增加密码 mysqladmin -u root -S /data/3306/mysql.sock password 'woshiniba' # 本机登录 mysql -u root -pwoshiniba -S /data/3306/mysql.sock # 远程登录 mysql -u remote -p 'woshiniba' -h 10.0.0.202 -P 3308