zoukankan      html  css  js  c++  java
  • Mysql

    Mysql

    数据库字符集设置

    yum install mariadb-server mariadb mariabd-libs -y
    systemctl start mariadb
    mysql
    MariaDB [(none)]> show variables like '%char%';

    方法一

    • vim /etc/my.cnf
    • [client]字段里加入:default-character-set=utf8
    • [mysqld]字段里加入:character-set-server=utf8
    • [mysql]字段里加入:default-character-set=utf8

    方法二

    show variables like'% char%';
    SET character _set_client=utf8; 
    SET character_set_results =utf8; 
    SET character_set_connection=utf8;
    systemctl restart mariadb
    MariaDB [(none)]> show variables like '%char%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)

    数据库密码管理

    1、创建用户及授权

    • 授权localhost主机通过admin用户和pass密码访问本地的final库的所有权限
    • 授权所有主机通过admin用户和admin密码访问本地的fina库的查询、插入、更新、删除权限
    • 授权192.168.10.240主机通过admin用户和pass密码访问本地的jfedu库的所有权限
    MariaDB [(none)]> create database final;
    Query OK, 1 row affected (0.00 sec)
    MariaDB [(none)]> grant all on final.* to admin@localhost identified by 'pass';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant select,insert,update,delete on final.* to admin@"%" identified by 'admin';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on final.* to admin@'192.168.10.254' identified by 'pass'; 
    Query OK, 0 rows affected (0.00 sec)

    2、密码破解方法

    [root@Final pub]# systemctl stop mariadb
    [root@Final pub]# /usr/bin/mysqld_safe --user=mysql --skip-grant-tables &
    [1] 9560
    [root@Final pub]# 190516 13:28:29 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
    190516 13:28:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
    
    [root@Final pub]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 1
    Server version: 5.5.60-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    MariaDB [(none)]> use mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    MariaDB [mysql]> update user set password=password('1') where user='root';
    Query OK, 4 rows affected (0.00 sec)
    Rows matched: 4  Changed: 4  Warnings: 0
    
    MariaDB [mysql]> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [mysql]> q
    Bye
    pkill mariadb
    systemctl start mariadb
    mysql -uroot -p
    

    数据库配置文件详解

    [mysqld]:服务器端配置
    datadir=/data/mysql:数据目录
    socket=/var/lib/mysql/mysql.sock:socket通信设置
    user=mysql:使用MySQL用户启动
    symbolic-links=0:是否支持快捷方式
    log-bin=mysql-bin:开启bin-log日志
    server-id=1:MySQL服务的ID
    auto_increment_offset=1:自增长字段从固定数开始
    auto_increment_increment=2:自增长字段每次递增的量
    socket=/tmp/mysql.sock:MySQL客户程序与服务器之间的本地通信套接字文件
    port=3306:指定MySQL监听的端口
    key_buffer=384MB:key_buffer是用于索引块的缓冲区大小
    table_cache=512:为所有线程打开表的数量
    sort_buffer_size=2MB:为每个需要进行排序的线程分配该大小的一个缓冲区
    read_buffer_size=2MB:读查询操作所能使用的缓冲区大小
    query_cache_size=32MB:指定MySQL查询结果缓冲区的大小
    read_rnd_buffer_size=8MB:改参数在使用行指针排序之后,随机读
    myisam_sort_buffer_size=64MB:MyISAM表发生变化时重新排序所需的缓冲
    thread_concurrency=8:最大并发线程数,取值为服务器逻辑CPU数量×2
    thread_cache=8:缓存可重用的线程数
    skip-locking:避免MySQL的外部锁定,减少出错几率增强稳定性
    default-storage-engine=INNODB:设置MySQL默认引擎为InnoDB
    #mysqld_safe config:MySQL服务安全配置
    [mysqld_safe]:MySQL服务安全启动配置
    log-error=/var/log/mysqld.log:MySQL错误日志路径
    pid-file=/var/run/mysqld/mysqld.pid:MySQL PID进程文件
    key_buffer_size=2048MB:MyISAM表索引缓冲区的大小
    max_connections=3000:MySQL最大连接数
    innodb_buffer_pool_size=2048MB:InnoDB内存缓冲数据和索引大小
    basedir=/usr/local/mysql55/:数据库安装路径
    [mysqldump]:数据库导出段配置
    max_allowed_packet=16MB:服务器和客户端发送的最大数据包

    数据库索引

    • 普通索引:normal,使用最广泛
    • 唯一索引:unique,不允许重复的索引,允许有空值
    • 全文索引:fulltext,只能用于MyISAM表,full text主要用于大量的内容检索
    • 主键索引:primary key又称为特殊的唯一索引,不允许有空值
    • 组合索引:为提高MySQL效率可建立组合索引。
    MySQL数据库表创建各个索引命令,以t1表为案例,操作如下:
    主键索引:ALTER TABLE t1 ADD PRIMARY KEY'column')。
    唯一索引:ALTER TABLE t1 ADD UNIQUE'column')。
    普通索引:ALTER TABLE t1 ADD INDEXindex_name('column')。
    全文索引:ALTER TABLE t1 ADD FULLTEXT('column')。
    组合索引:ALTER TABLE t1 ADD INDEX index_name('column1''column2',column3')。

    MySQL数据库索引的缺点如下:

    • MySQL数据库索引虽然能够提高数据库查询速度,但同时会降低更新、删除、插入表的速度,例如对表进行insert、update、delete时,update表MySQL不仅要保存数据,还需保存更新索引;
    • 建立索引会占用磁盘空间,大表上创建了多种组合索引,索引文件就会占用大量的空间。

    数据库慢查询

    show variables like "%slow%";
    show variables like "%long_query%";

    • log_slow_queries:关闭慢查询日志功能
    • long_query_time:慢查询超时时间,默认为10s,MySQL5.5以上可以设置微秒
    • slow_query_log:关闭慢查询日志
    • slow_query_log_file:慢查询日志文件
    • slow_launch_time:thread create时间,单位为秒,如果thread create的时间超过了这个值,该变量slow_launch_time的值会加1
    MariaDB [(none)]> show variables like "%slow%";
    +---------------------+--------------------------------------------------------------------------------------------------------------+
    | Variable_name       | Value                                                                                                        |
    +---------------------+--------------------------------------------------------------------------------------------------------------+
    | log_slow_filter     | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
    | log_slow_queries    | OFF                                                                                                          |
    | log_slow_rate_limit | 1                                                                                                            |
    | log_slow_verbosity  ||
    | slow_launch_time    | 2                                                                                                            |
    | slow_query_log      | OFF                                                                                                          |
    | slow_query_log_file | Final-slow.log                                                                                               |
    +---------------------+--------------------------------------------------------------------------------------------------------------+
    7 rows in set (0.00 sec)
    MariaDB [(none)]> show variables like "%long_query%";
    +-----------------+-----------+
    | Variable_name   | Value     |
    +-----------------+-----------+
    | long_query_time | 10.000000 |
    +-----------------+-----------+
    1 row in set (0.00 sec)

    开启慢查询日志

    方法一
    set global slow_query_log=on;
    show variables like"%slow%";
    方法二
    在 /etc/my.cnf文件中[mysqld]下添加
    log-slow-queries=/var/log/mariadb/mysql.log
    long_query_time=0.01
    log-queries-not-using-indexes

    执行命令mysqldumpslow -h可以查看命令帮助信息,主要参数包括-s和-t,其中-s是排序参数

    • l:查询锁的总时间
    • r:返回记录数
    • t:查询总时间排序
    • al:平均锁定时间
    • ar:平均返回记录数
    • at:平均查询时间
    • c:计数
    • t n:显示头n条记录

    MySQL慢查询mysqldumpslow按照返回的行数从大到小,查看前2行
    mysqldumpslow -s r -t 2 /var/log/mariadb/mysql.log

    MySQL慢查询mysqldumpslow按照查询总时间从大到小,查看前5行,同时过滤select的SQL语句
    mysqldumpslow -s t -t 5 -g /var/log/mariadb/mysql.log

    数据库优化

    MySQL数据库优化是一项非常重要的工作,而且是一项长期的工作,MySQL优化三分靠配置文件及硬件资源的优化,七分靠SQL语句的优化。
    MySQL数据库具体优化包括:配置文件的优化、SQL语句的优化、表结构的优化、索引的优化,而配置的优化包括:系统内核、硬件资源、内存、CPU、MySQL本身配置文件的优化。
    硬件上的优化有两种方式:

    • 一种是增加内存和提高磁盘读写速度,进而提高MySQL数据库的查询、更新的速度
    • 另一种提高MySQL性能的方式是使用多块磁盘来存储数据,可以从多块磁盘上并行读取数据,进而提高读取数据的速度

    MySQL参数的优化,内存中会为MySQL保留部分的缓冲区,这些缓冲区可以提高MySQL的速度,缓冲区的大小可以在MySQL的配置文件中进行设置。
    以下为企业级MySQL百万量级真实环境配置文件my.cnf的内容,用户可以根据实际情况修改,代码如下:

    [client]
    port=3306
    socket=/tmp/mysql.sock.
    [mysqld]
    user=mysq1
    server_id=10
    port=3306
    socket=/tmp/mysql.sock datadir=/data/mysql/
    old_ passwords=1
    lower_case_table_names=1
    character-set-server=utf8
    default-storage-engine=MYISAM
    log-bin=bin.log
    log-error=error.log pid-file=mysql.pid
    long_query_time=2
    slow_query_1og slow_query_log_file=slow.1og binlog_cache_size=4MB binlog_format=mixed maxbinlog_cache_size=16MB max binlog size=1GBexpire_logs_days=30
    ft_min_word_len=4
    back_1og=512
    max allowed packet =64MB max_connections=4096
    max connect errors=100
    join_ buffer_size=2MB
    read buffer size=2MB
    read rnd buffer_size=2MB
    sort buffer_size=2MB
    query_cache_size=64MB
    table_open_cache=10000
    thread_cache_size=256
    max heap table size =64MB
    tmp_table_size=64MB
    thread_stack=192KB
    thread_concurrency=24
    local-infile=0
    skip-show-database
    skip-name-resolve
    skip-external-locking
    connect_timeout=600
    interactive timeout=600
    wait_timeout=600
    #***MYISAM
    key_buffer_size=512MB
    bulk_insert_buffer_size=64MB
    myisam_sort_buffer_size=64MB
    myisam_max_sort_file_size=1GB
    myisam_repair_threads=1
    concurrent_insert=2
    myisam_recover
    #***INNODB
    innodb_buffer_pool_size=64GB
    innodb additional_mem_pool_size=32MB
    innodb data_file_path=ibdatal:1G;ibdata2:1G:autoextend
    innodb read io_threads=8
    innodb write io threads=8
    innodb file_per_table=1
    innodb flush log at_trx commit=2
    innodb lock wait timeout =120
    innodb log buffer size=8MBinnodb_log_file_size=256MB innodb_log files_in_group=3
    innodb_max dirty_pages_pct=90
    innodb_thread_concurrency=16
    innodb_open_files=10000
    #innodb_ force_recovery=4
    #***Replication Slave read-only
    #skip-slave-start relay-log=relay.1og
    1og-slave-updates

    数据库集群

    随着访问量的不断增加,单台MySQL数据库服务器压力不断地增加,需要对MySQL进行优化和架构改造,如果MyQSL优化不能明显改善压力,可以使用高可用、主从复制、读写分离来、拆分库、拆分表等方法来进行优化。

    MySQL主从复制集群至少需要2台数据库服务器,其中一台为master库,另外一台为slave库,MySQL主从数据同步是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,bin-log日志用于记录在master库中执行的增、删、修改、更新操作的SQL语句,整个过程需要开启3个线程,分别是master开启I/O线程,slave开启I/O线程和SQL线程,具体主从同步原理详解如下:

    • slave 上执行slave start,slave I/O线程会通过在master创建的授权用户连接上至master,并请求master从指定的文件和位置之后发送bin-log日志内容
    • master接收到来自slave I/O线程的请求后,master I/O线程根据slave发送的指定bin-log日志position点之后的内容,然后返回给slave的I/O线程
    • 返回的信息中除了bin-log日志内容外,还有master最新的bin-log文件名以及在bin-log中的下一个指定更新position点
    • slaveI/O线程接收到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的最末端,并将读取到的master端的bin-log的文件名和position点记录到master.info文件中,以便在下一次读取的时候能告知master从相应的bin-log文件名及最后一个position点开始发起请求
    • slave SQL线程检测到relay-log中内容有更新,会立刻解析relay-log日志中的内容,将解析后的SQL语句在slave里执行,执行成功后slave库与master库数据保持一致。

    主从复制

    master

    [root@Final pub]# vim /etc/my.cnf
    
    [mysqld]
    character-set-server=utf8
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    # Settings user and group are ignored when systemd is used.
    # If you need to run mysqld under a different user or group,
    # customize your systemd unit file for mariadb according to the
    # instructions in http://fedoraproject.org/wiki/Systemd
    #log_slow_queries=on
    log-slow-queries=/var/log/mariadb/mysql.log
    long_query_time=0.01
    log-queries-not-using-indexes
    server-id=10
    log-bin=mysql-bin
    
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    
    [mysql]
    default-character-set=uft8
    [client]
    default-character-set=utf8
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    MariaDB [(none)]> grant replication slave on *.* to 'mysqlsync'@'%' identified by 'pass';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      245 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)

    slave

    [root@Final pub]# vim /etc/my.cnf
    
    [mysqld]
    character-set-server=utf8
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    # Settings user and group are ignored when systemd is used.
    # If you need to run mysqld under a different user or group,
    # customize your systemd unit file for mariadb according to the
    # instructions in http://fedoraproject.org/wiki/Systemd
    #log_slow_queries=on
    log-slow-queries=/var/log/mariadb/mysql.log
    long_query_time=0.01
    log-queries-not-using-indexes
    server-id=20
    #log-bin=mysql-bin
    
    [mysqld_safe]
    log-error=/var/log/mariadb/mariadb.log
    pid-file=/var/run/mariadb/mariadb.pid
    
    [mysql]
    default-character-set=uft8
    [client]
    default-character-set=utf8
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    MariaDB [(none)]> change master to master_host='192.168.10.254',master_user='mysqlsync',master_password='1',master_log_file='mysql-bin.000001',master_log_pos=245;
    Query OK, 0 rows affected (0.05 sec)
    
    MariaDB [(none)]> slave start;
    Query OK, 0 rows affected (0.02 sec)
    
    MariaDB [(none)]> show slave statusG
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    

    验证

    master
    create database test233;
    slave
    show databases;
    master 
    drop database test233;
    slave 
    show databases;

    主从同步排错

    MySQL主从同步集群在生产环境使用时,如果主从服务器之间网络通信条件差或者数据库数据量非常大,容易导致MySQL主从同步延迟。
    MySQL主从产生延迟之后,一旦主库宕机,会导致部分数据没有及时同步至从库,重新启动主库,会导致从库与主库同步错误,快速恢复主从同步关系有如下两种方法:
    1、忽略错误后,继续同步
    此种方法适用于主从库数据内容相差不大的情况。
    master端执行如下命令,将数据库设置为全局读锁,不允许写入新数据。

    flush tables with read lock;

    slave 端停止slave I/O及SQL线程,同时将同步错误的SQL跳过1次,跳过错误会导致数据不一致,启动 start slave,同步状态恢复,命令如下:

    stop slave;
    set global sql_slave_skip_counter=1;
    start slave;
    
    show slave statusG

    2、重新做主从同步,使数据完全同步。
    此种方法适用于主从库数据内容相差很大的情况。
    master端执行如下命令,将数据库设置全局读锁,不允许写人新数据。

    flush tables with read lock

    master端基于mysqldump、xtrabackup工具对数据库进行完整备份,也可以用shell脚本或python脚本实现定时备份,备份成功之后,将完整的数据导入至从库,重新配置主从关系,当slave端的I/O线程、SQL线程均为Yes之后,最后将master端读锁解开即可,解锁命令如下:

    unlock tables;
  • 相关阅读:
    反向迭代器实现字符串逆序
    排序更新
    快速排序的实现方法,调用sort函数
    第k个素数
    ACM Online Judge
    Hadoop系列(一)开篇简介
    Hadoop系列(番外) hadoop3.1.2的完全分布式部署
    synchronized关键字
    Oracle的运行
    在Oracle下创建数据库,连接数据库
  • 原文地址:https://www.cnblogs.com/fina/p/10879592.html
Copyright © 2011-2022 走看看