MySQL
Введение в MySQL
Первоначально MySQL была системой управления реляционными базами данных с открытым исходным кодом.Первоначальным разработчиком была шведская компания MySQL AB, которая была приобретена Sun Microsystems в 2008 году. В 2009 году корпорация Oracle (Oracle) приобрела Sun Microsystems, и MySQL стала продуктом Oracle.
MySQL стала самой популярной базой данных с открытым исходным кодом в прошлом из-за ее высокой производительности, низкой стоимости и хорошей надежности, поэтому она широко использовалась на малых и средних веб-сайтах в Интернете. Поскольку MySQL продолжает развиваться, она также постепенно используется в более крупных веб-сайтах и приложениях, таких как Википедия, Google и Facebook. Буква «M» в очень популярном портфеле программного обеспечения с открытым исходным кодом LAMP относится к MySQL.
Однако после приобретения корпорацией Oracle корпорация Oracle значительно повысила цену на коммерческую версию MySQL, а корпорация Oracle больше не поддерживает разработку другого проекта свободного программного обеспечения OpenSolaris, поэтому сообщество свободного программного обеспечения обеспокоено тем, будет ли Oracle продолжать поддерживать MySQL. Версия MySQL (единственная бесплатная версия MySQL) вызывает некоторые опасения.Основатель MySQL Майкл Видениус создал план филиала MariaDB на основе MySQL. И некоторое программное обеспечение с открытым исходным кодом, которое использовало MySQL, постепенно перешло на MariaDB или другие базы данных. Например, в 2013 году Википедия официально объявила о переходе с базы данных MySQL на базу данных MariaDB [6].
Реляционная база данных
Реляционная база данных (англ. Relational database) — это база данных, созданная на основе реляционной модели, которая использует математические концепции и методы, такие как алгебра множеств, для обработки данных в базе данных. Различные сущности в реальном мире и различные связи между сущностями представлены реляционными моделями. Реляционная модель была впервые предложена Эдгаром Коддом в 1970 году в сочетании с «Двенадцатью законами Кодда». Хотя сегодня есть некоторые критики этой модели, она по-прежнему остается традиционным стандартом для хранения данных. Стандартный язык запросов данных SQL — это язык, основанный на реляционных базах данных, который выполняет поиск и обработку данных в реляционных базах данных.
Реляционная модель состоит из трех частей: реляционная структура данных, набор реляционных операций и ограничения реляционной целостности.
Возможности MySQL
MySQL — широко используемая база данных со следующими характеристиками:
-
Написано на C и C++ и протестировано несколькими компиляторами для обеспечения переносимости исходного кода.
-
Поддерживает AIX, FreeBSD, HP-UX, Linux, Mac OS, Novell Netware, OpenBSD, OS/2. Wrap, Solaris, Windows и другие операционные системы.
-
API предоставляются для нескольких языков программирования. Языки программирования включают, среди прочего, C, C++, Python, Java, Perl, PHP, Eiffel, Ruby и Tcl.
-
Поддержка многопоточности, полное использование ресурсов процессора
-
Оптимизированный алгоритм запросов SQL для эффективного повышения скорости запросов
-
Его можно использовать либо как отдельное приложение в сетевой среде клиент-сервер, либо как библиотеку. Встроенные в другое программное обеспечение для обеспечения многоязычной поддержки, общие кодировки, такие как китайский GB 2312, BIG5, японский Shift_JIS и т. д., могут использоваться в качестве имен таблиц данных и имен столбцов данных.
-
Предоставляет несколько методов подключения к базе данных, таких как TCP/IP, ODBC и JDBC.
-
Предоставляет административные инструменты для управления, проверки и оптимизации операций базы данных.
-
Может обрабатывать большие базы данных с десятками миллионов записей
Приложение MySQL
По сравнению с большими базами данных, такими как Oracle, DB2, SQL Server и т. д., у MySQL есть свои недостатки, такие как небольшой масштаб и ограниченные функции (функции и эффективность MySQL Cluster относительно низкие) и т. д., но это не уменьшает это ни малейшей популярности. Для среднего индивидуального пользователя и малого и среднего бизнеса MySQL предоставляет более чем достаточную функциональность, а поскольку MySQL является программным обеспечением с открытым исходным кодом, это может значительно снизить общую стоимость владения. В настоящее время популярной архитектурой веб-сайтов в Интернете является LAMP (Linux+Apache+MySQL+PHP), то есть с использованием Linux в качестве операционной системы, Apache в качестве веб-сервера, MySQL в качестве базы данных и PHP в качестве интерпретатора сценариев на стороне сервера. . Поскольку Linux+Apache+MySQL+PHP — это бесплатное программное обеспечение или программное обеспечение с открытым исходным кодом (FLOSS), вы можете создать стабильную и бесплатную систему веб-сайта, не тратя ни копейки, используя LAMP.
Механизм хранения MySQL
- Введение в механизм хранения MySQL
Подключаемый механизм хранения — одна из наиболее важных функций базы данных MySQL.Пользователи могут выбирать, как хранить и индексировать базу данных, использовать ли транзакции и т. д. в соответствии с потребностями приложения. mySQL по умолчанию поддерживает несколько механизмов хранения, чтобы удовлетворить потребности приложений баз данных в различных областях. Пользователи могут использовать различные механизмы хранения для повышения эффективности приложений и предоставления гибкого хранилища.Пользовательские настройки могут настраивать и использовать собственные механизмы хранения в соответствии со своими потребностями для достижения максимальной настраиваемости. Наиболее часто используемыми механизмами хранения MySQL являются MyISAM, InnoDB, MEMORY и MERGE. InnoDB предоставляет безопасные для транзакций таблицы, а другие механизмы хранения не являются безопасными для транзакций. MyISAM — это механизм хранения по умолчанию для MySQL. MyISAM не поддерживает транзакции или внешние ключи, но имеет высокую скорость доступа и не требует целостности транзакций. Механизм хранения InnoDB обеспечивает безопасность транзакций с возможностью фиксации, отката и восстановления после сбоя. Но по сравнению с механизмом хранения MyISAM записи InnoDB менее эффективны и занимают больше места на диске для хранения данных и индексов. MySQL поддерживает только InnoDB в качестве механизма хранения внешнего ключа.При создании внешнего ключа требуется, чтобы прикрепленная таблица имела соответствующий индекс, а подтаблица автоматически создаст соответствующий индекс при создании внешнего ключа.
- Особенности механизма хранения MySQL
В основном это отражается на производительности, транзакциях, управлении параллелизмом, ссылочной целостности, кеше, устранении сбоев, резервном копировании и восстановлении и т. д. В настоящее время популярными механизмами хранения являются MyISAM и InnoDB, а MyISAM является первым выбором для большинства веб-приложений. Основные различия между MyISAM и InnoDB заключаются в производительности и управлении транзакциями. MyISAM является расширенной реализацией раннего ISAM (метод индексированного последовательного доступа). ISAM предназначен для обработки случая, когда частота чтения намного превышает частоту записи. Поэтому ISAM и более поздние версии MyISAM не учитывали поддержку вещей, а никаких записей о транзакциях не требовалось Эффективность запросов ISAM впечатляет, а занимаемая память очень мала. Унаследовав преимущества ISAM, MyISAM идет в ногу со временем и предоставляет большое количество новых практических функций и сопутствующих инструментов. Например, для управления параллелизмом предусмотрены блокировки на уровне таблицы. А поскольку MyISAM использует свой собственный независимый файл хранения (файл данных MYD и индексный файл MYI) для каждой таблицы, резервное копирование и восстановление очень удобны (копирование и перезапись), а также поддерживается онлайн-восстановление. Таким образом, если приложение не нуждается в транзакциях, не поддерживает внешние ключи и обрабатывает только базовые операции CRUD (добавление, удаление, изменение и поиск), тогда MyISAM — лучший выбор.
Установите mysql8.0 под linux (CentOS7.5_x86_64)
# 下载mysql
$ wget http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.13-el7-x86_64.tar.gz
# 解压
$ mysql tar -zxvf mysql-8.0.4-rc-linux-glibc2.12-x86_64.tar.gz -C /usr/local
# 修改文件夹名称
$ mv mysql-8.0.4-rc-linux-glibc2.12-x86_64/ mysql
添加默认配置文件
$ vim/etc/my.cnf
[client]
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
user=mysql
socket=/tmp/mysql.sock
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
# 创建mysql组
$ groupadd mysql
# 创建mysql用户
$ useradd -g mysql mysql
# 创建mysql数据目录
$ mkdir $MYSQL_HOME/data
# 初始化mysql
$ /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
# 初始化报错
bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
# 解决方法
yum install -y libaio
# 初始化报错
2018-07-08T02:53:24.542370Z 0 [System] [MY-010116] /usr/local/mysql/bin/mysqld (mysqld 8.0.4-rc) starting as process 17745 ...
mysqld: Can't create/write to file '/tmp/mysql/data/ibd35qXQ' (Errcode: 13 - Permission denied)
2018-07-08T02:53:24.554816Z 1 [ERROR] [MY-011066] InnoDB: Unable to create temporary file; errno: 13
2018-07-08T02:53:24.554856Z 1 [ERROR] [MY-011066] InnoDB: InnoDB Database creation was aborted with error Generic error. You may need to delete the ibdata1 file before trying to start up again.
2018-07-08T02:53:24.555000Z 0 [ERROR] [MY-010020] Data Dictionary initialization failed.
2018-07-08T02:53:24.555033Z 0 [ERROR] [MY-010119] Aborting
2018-07-08T02:53:24.555919Z 0 [System] [MY-010910] /usr/local/mysql/bin/mysqld: Shutdown complete.
# 解决办法:修改/tmp/mysql的目录权限
$ chown -R mysql:mysql /tmp/mysql
# 初始化成功
> 如果无异常情况日志如下可以看到mysql默认会生成root账号和密码root@localhost: /TI(mjVAs1Ta
[root@localhost mysql]# bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2019-01-29T10:19:34.023997Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.13) initializing of server in progress as process 4240
2019-01-29T10:19:39.764895Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: /TI(mjVAs1Ta
2019-01-29T10:19:43.041419Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.13) initializing of server has completed
# 拷贝mysql启动文件到系统初始化目录
$ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# 启动mysql服务器
$ service mysqld start
базовые операции mysql
# 使用mysql客户端连接mysql
$ /usr/local/mysql/bin/mysql -u root -p password
修改mysql的默认初始化密码
> alter user 'root'@'localhost' identified by 'root';
# 创建用户 CREATE USER '用户名称'@'主机名称' INDENTIFIED BY '用户密码'
> create user 'jack'@'localhost' identified by 'jack';
# 授予权限 grant 权限 on 数据库.表 to '用户名'@'登录主机' [INDENTIFIED BY '用户密码'];
> grant replication slave on *.* to 'jack'@'localhost';
# 刷新
# $ flush privileges;
# 修改root用户可以远程连接
> update mysql.user set host='%' where user='root';
# 查看mysql所用用户
> select user,host from mysql.user;
# docker 修改mysql的最大连接数
apt-get update
apt-get install vim
vim /etc/mysql/mysql.conf.d/mysqld.cnf
max_connections=1000
> alter user 'root'@'%' identified with mysql_native_password by 'root';
репликация master-slave кластера mysql
Подготовьте два установленных сервера mysql 192.168.79.15 (мастер) 192.168.79.16 (подчиненный)
# 配置主服务添加如下配置
$ vim /etc/my.cnf
# 节点唯一id值
server-id=1
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式 有mixed|row|statement 推荐mixed
binlog-format=mixed
# 步进值auto_imcrement。一般有n台主MySQL就填n(可选配置)
auto_increment_increment=2
# 起始值。一般填第n台主MySQL。此时为第一台主MySQL(可选配置)
auto_increment_offset=1
# 忽略mysql库(可选配置)
binlog-ignore=mysql
# 忽略information_schema库(可选配置)
binlog-ignore=information_schema
# 要同步的数据库,默认所有库(可选配置)
replicate-do-db=db1
# slave 节点配置
# 节点唯一id值
server-id=2
# 开启二进制日志
log-bin=mysql-bin
# 步进值auto_imcrement。一般有n台主MySQL就填n(可选配置)
auto_increment_increment=2
# 起始值。一般填第n台主MySQL。此时为第一台主MySQL(可选配置)
auto_increment_offset=2
# 要同步的数据库,默认所有库(可选配置)
replicate-do-db=db1
# 查看 master 的状态 , 尤其是当前的日志及位置
> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 1608 | | | |
+------------------+----------+--------------+------------------+-------------------+
# 在slave节点执行如下命令
注意master_log_file 是对应show master status;中file的值,master_log_pos是对应position的值
> change master to
master_host='192.168.79.15',
master_user='root',
master_password='root',
master_log_file='mysql-bin.000009',
master_log_pos=0;
# 启动 slave 状态 ( 开始监听 msater 的变化 )
> start slave;
# 查看 slave 的状态
> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.79.15
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 863
Relay_Log_File: node-6-relay-bin.000002
Relay_Log_Pos: 500
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 863
Relay_Log_Space: 709
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 6291c709-23af-11e9-99fb-000c29071862
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
# 当Slave_IO_Running: Yes和Slave_SQL_Running: Yes都为yes是说明主从复制正常
#重置 slave 状态 .
$ reset slave;
#暂停 slave 状态 ;
$ stop slave;