Тег mysql

RA

Раньше на ubuntu 16.04 можно было поставить mysql 5.6 заменой названия версии дистрибудитва и он с 15.10 норм ставился. Теперь что-то сломали в зависимостях и mysql 5.6 был снесён при очередном обновлении.

Пробовал 5.7. Но т.к. в 5.7 починили/поломали работу с geometry, то лопатить код под 5.7 не хочется.
Поставил mariadb 10.2. И вздохнул спокойно. Всё работает и geometry в том числе.

PS Про geometry. Есть поля типа POINT, и в mysql 5.6 в эти поля можно было записать пустую строку. А 5.7 хочет видеть в этих полях только объект geometry. Вот такая обратная совместимость.

RA

К вопросу сколько символов выделять под фамилию

Пабло-Диего-Хосе-Франсиско-де-Паула-Хуан-Непомусено-Мария-де-лос-Ремедиос-Киприано-де-ла-Сантисима-Тринидад-Мартир-Патрисио-Клито-Руиз-и-Пикассо

RA

Например мы храним данные в mysql и используем elastic для поиска.
Как обеспечить целосность связки mysql->elastic?

Есть 2 варианта
1. Записывать в элестик изменения сразу же как только что-то изменилось в БД.
"+" - в эластике всегда актуальные данные
"-" - если что-то пошло не так (откат транзакции mysql или отвалился elastic), то целосность данных нарушается

  1. Время от времени записывать в эластик изменённые данные.
    "+" - если что-то заглючит, то изменения будут внесены позже
    "-" - нельзя полагаться на актуальность данных из эластика

Или есть ещё варианты?

RA

Вот вы индексы к mysql таблице добавляете сразу при создании таблицы, или как-нибудь потом когда окажется что селекты тормозят?

RA

Ок, посоны, скажите и вы своё мнение.
Таблица items в mysql. Нам нужно добавить к модели список цветов. Поиска по цвету не будет.
Т.е. должно получиться так
item1 - красный, жёлтый, зелёный
item2 - жёлтый, синий

Варианты решения задачи
1) сделать ещё одну таблицу item_color и реализовать типичное отношение один ко многим;
2) добавить поле colors в таблицу items, где хранить цвета через запятую.

Ваше мнение.

unfalse

"Ух, бля!"
Sharepoint + MySQL, это что-то новенькое.

RA

Нужно получить строки с lang='EN', только если не нашлась строка с lang='RU'

Есть такое решение
SELECT *
FROM table
WHERE lang IN ('EN', 'RU')
AND (lang='RU' OR NOT EXISTS(SELECT lang FROM table WHERE lang='RU'))

Но по-моему такой запрос просто обязан тормозить.
Борюсь с собой или прокостылять так всего в одном месте или дозаполнить ~20 таблиц недостающими значениями для всех языков.

RA

Из резюме


По-моему тут нет повода для гордости

RA

Postgres vs Mysql от Uber.
Постгрес архитектурно проиграет мускулю.

https://m.habrahabr.ru/comp...osadmin/blog/322624/

RA

in my.ini file

mysql<= 5.6.5 sql-mode=""
mysql<= 5.6.6 sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
В итоге в 5.6.6 имеем проблему с дефолтными значениями. Решение - поставить sql-mode=""

RA

Ебатушки-ребятушки

MySQL's utf8 encoding is not actual UTF-8. It's an encoding that is kinda like UTF-8, but only supports a subset of what UTF-8 supports. utf8mb4 is actual UTF-8.

А чтобы перейти с utf8 на utf8mb4 надо сделать 6 шагов
https://mathiasbynens.be/no...8mb4#utf8-to-utf8mb4

Но и этого мало. utf8mb4 не умеет fulltext индексы. А значит придётся делать одно поле utf8, а второе utf8mb4.
И это всё надо чтобы хранить в базе смайлики. Скажите мне что я не прав и можно сделать иначе.

RA

Есть таблица 10Г. Хочу разбить её на PARTITION.
Mysql при выполнении этой операции залочит таблицу?

schors

Запутался. есть таблица A с полями id, value, есть таблица B с полями id, value, a_id. B.a_id заявлен как FOREIGN KEY к A.id. Мне надо в транзакции залочить два неких ряда из таблицы A и всё что там к ним привязано в таблице B. Ничего кроме увесистого SELECT FOR UPDATE LEFT JOIN который потом ещё и софтварно разбирать (или повторять SELECT, но уже потаблично) не придумал

schors

А кто-нибудь транзакции в Python MySQLdb использовал? Как ловить last_insert_id() внутри транзакции? Сейчас ловлю через cursor.lastrowid, но чую бесовщину - я же не закоммитил ещё...

schors

никогда не делайте zfs set primarycache=metadata tank/db на FS с MyISAM. ну т.е. понятно почему, но за всеми этими перделками и свистелками скопипастил неглядя

schors

а кто чем парсит slow log в mysql? собственно меня интересует как бы их попользовательно побазно что ли раскидать, время человеческое прописать...

schors

а кто чем парсит slow log в mysql? собственно меня интересует как бы их попользовательно побазно что ли раскидать, время человеческое прописать...

www

Добавление к предыдущим постам. Поставил на машину с SSD mysql сервер, потестил innodb. Параметры innodb дефолтные для 5.6. Поставил лишь

innodb_log_buffer_size=500M
innodb_buffer_pool_size=1G

Пробовал O_DIRECT, с ним немного медленнее, убрал. Такая же таблица на 2,5 млн, такие же дефолтные параметры sysbench, такое же железо (на самом деле тестил на датаноде, там всё равно нагрузки сейчас нет никакой).
Результаты:

[user@localhost ~]$ sysbench --num-threads=100 --max-requests=100000 --oltp-table-size=2500000 --mysql-host=my_host --mysql-db=my_test --mysql-user=test  --db-driver=mysql --test=oltp run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 100

Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations,  1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 100000
Threads started!
Done.

OLTP test statistics:
    queries performed:
        read:                            1400476
        write:                          500170
        other:                          200068
        total:                          2100714
    transactions:                        100034 (2210.84 per sec.)
    deadlocks:                          0      (0.00 per sec.)
    read/write requests:                1900646 (42005.92 per sec.)
    other operations:                    200068 (4421.68 per sec.)

Test execution summary:
    total time:                          45.2471s
    total number of events:              100034
    total time taken by event execution: 4522.8856
    per-request statistics:
        min:                                  3.19ms
        avg:                                45.21ms
        max:                                948.74ms
        approx.  95 percentile:              94.73ms

Threads fairness:
    events (avg/stddev):          1000.3400/23.82
    execution time (avg/stddev):  45.2289/0.01

Как видно, даже немного лучше кластера. top на хосте показывает чуть более 395% нагрузки процессора.
Забыл в предыдущих хостах конфиги кластера.
my.cnf (только [mysqld], [client] и другое не привожу):

[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
port=3306
basedir=/usr
log-error=/var/log/mysqld/mysqld.53.err
expire_logs_days=10
datadir="/var/lib/mysql"
tmpdir=/tmp
ndbcluster=on
ndb-nodeid=53 
ndb-connectstring=<ip адрес ndb_mgmd>:1186

ndb-cluster-connection-pool=4
#autocommit=off 
ndb-force-send=0
ndb-use-exact-count=0
ndb-batch-size=64M
ndb-autoincrement-prefetch-sz=1024
default-storage-engine=ndbcluster

В некоторых манах советуют отключать автокоммит, чтобы он группировал транзакции. Видимо, это я не осилил (работало с моим конфигом ещё медленнее + глючило). Соответственно, ndb-batch-size и ndb-forse-send по идее игнорируются

config.ini:

[NDB_MGMD DEFAULT]
Portnumber=1186

[NDB_MGMD]
NodeId=49
HostName=<ip management ноды>
DataDir=/data/Cluster/49/
Portnumber=1186

[TCP DEFAULT]
SendBufferMemory=4M
ReceiveBufferMemory=4M

[NDBD DEFAULT]
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
BackupReportFrequency=10
MemReportFrequency=30
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15
DataMemory=3600M
IndexMemory=750M
MaxNoOfTables=2048
MaxNoOfTriggers=2048
MaxNoOfOrderedIndexes=1024
MaxNoOfAttributes=2048
NoOfReplicas=2
StringMemory=25
DiskPageBufferMemory=64M

MaxNoOfConcurrentTransactions=16384
MaxNoOfConcurrentOperations=100000
BatchSizePerLocalScan=512
FragmentLogFileSize=256M
NoOfFragmentLogFiles=22 # 6xDataMemory [in MB]/(4 *FragmentLogFileSize [in MB]                                                                  
RedoBuffer=32M
MaxNoOfExecutionThreads=4
StopOnError=false
LockPagesInMainMemory=1

SharedGlobalMemory=256M #default 128

TransactionDeadlockDetectionTimeout=52000
[NDBD]
NodeId=1
HostName=<ip первой датаноды>
DataDir=/data/Cluster/1/

[NDBD]
NodeId=2
HostName=<ip второй датаноды>
DataDir=/data/Cluster/2/

[MYSQLD DEFAULT]

[MYSQLD]
NodeId=53
HostName=<ip mysql сервера>
[MYSQLD]
[MYSQLD]
[MYSQLD]

Пустые секции mysql - для подключения в несколько потоков.

По I/O пока ничего не скажу, кроме того, что при тесте на один хост с innodb iotop показывает циферки побольше раза в 2 (около 40 M/S), чем при тесте кластера . Надеюсь, поставлю мониторинг датанод, можно будет посмотреть графики/статистику, не только с количеством записанного, но и с tps за всё время теста.

В итоге сейчас результаты примерно одинаковые, что для 1 innodb, что для кластера из 4х нод. При этом датаноды и по CPU, и по IO загружены примерно на половину возможного, а mysql серверы загружаются на полную.

www

Посмотрел на результаты того, что даёт собранный из подручных средств кластер. Подручные средства примерно такие:
процессоры на нодах одинаковые: Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz
mysql server: 8Gb RAM, какой-то жесткий из ноута
datanode: 12 Gb RAM (на самом деле можно меньше), какой-то SSD (лень устанавливать hdparm и смотреть, что там (а тем более идти в офис))
Датанод 2, сервер 1 + не самый дорогой роутер TPlink на гигабит. Запустил sysbench с дефолтными параметрами и размером таблицы в 2,5 млн записей (остальные параметры видно в выводе):

Running the test with following options:
Number of threads: 100

Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations,  1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 100000
Threads started!
Done.

OLTP test statistics:
    queries performed:
        read:                            1400140
        write:                           500050
        other:                           200020
        total:                           2100210
    transactions:                        100010 (1596.21 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 1900190 (30327.94 per sec.)
    other operations:                    200020 (3192.42 per sec.)

Test execution summary:
    total time:                          62.6548s
    total number of events:              100010
    total time taken by event execution: 6262.6459
    per-request statistics:
         min:                                 17.83ms
         avg:                                 62.62ms
         max:                                793.49ms
         approx.  95 percentile:             132.30ms

Threads fairness:
    events (avg/stddev):           1000.1000/21.71
    execution time (avg/stddev):   62.6265/0.01

Сейчас сервер mysqld по CPU загружен на полную (375-380% в top), а датаноды загружены чуть больше, чем на четверть (ndbmtd показывает 140% в top).
Может быть, в скором времени покажу результаты в нормальной сети и на другом железе.

www

openvpn для рабочего окружения сделал. Довольно стабильно и удобно. Weltschmerz, спасибо.
Теперь другой вопрос. Как делать репликацию: поверх vpn или использовать встроенное шифрование ( http://dev.mysql.com/doc/re...n-solutions-ssl.html )? Мне кажется неплохим второй вариант.

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.