Архив рубрики: mysql

phpmyadmin + apach2

sudo apt-get install phpmyadmin

Если у Вас в репозитории свежий пакет phpmyadmin, то в процессе установки он спросит пароль для доступа к базе данных mysql, а так же там он создаст свои таблицы с настройками, а ещё спросит логин и пароль для своего постоянного использования. Затем перезапускаем наш веб-сервер Apache:

sudo /etc/init.d/apache2 restart

Теперь мы смело можем проверить на работоспособность сие дивное веб-приложение. Для этого набираем, если на локальном компьютере то ссылку в браузере:

http://localhost/phpmyadmin

А если с другого компьютера в сети, то пишем тогда:

http://192.168.100.134/phpmyadmin

соответственно вместо 192.168.100.134 у Вас будет своя айпишка сервера, которую и надо соответственно вписать. Если всё прошло удачно, то наслаждаемся пользованием сия дивного продукта, но если не грузится страничка и выдаёт ошибку, то тогда редактируем конфигурационный файлик Apache:

sudo nano /etc/apache2/apache2.conf

И в конец открывшегося файла добавляем строчку:

Include /etc/phpmyadmin/apache.conf

Затем нажимаем клавишу F3 для сохранения, enter — для подтверждения, и F2 — для выхода из файла. Затем нам останется только заново перезагрузить наш вэб-сервер:

sudo /etc/init.d/apache2 restart

Вот теперь то не должно никаких абсолютно проблем возникнуть, для проверки опять же открываем браузер, как было написано чуть выше и проверяем работоспособность, и соответственно радуемся  :) .

create admin for mysql and workbanch

link

CREATEUSER'username'@'localhost' IDENTIFIED BY'password';GRANTALL PRIVILEGES ON*.*TO'username'@'localhost'WITHGRANTOPTION;CREATEUSER'username'@'%' IDENTIFIED BY'password';GRANTALL PRIVILEGES ON*.*TO'username'@'%'WITHGRANTOPTION;

FLUSH PRIVILEGES;

Also may be:

I added this line to my /etc/ssh/sshd_config file:

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

and restarted ssh: systemctl restart ssh

Rails preload, eager_load, includes и joins.

http://habrahabr.ru/post/191762/

http://sqlfiddle.com/#!2/659f69/1

Rails предоставляют нам 4 различных способа загрузки ассоциаций: preload, eager_load, includes и joins. Рассмотрим каждый из них:

Preload


Этот метод загружает ассоциации в отдельном запросе:

User.preload(:posts).to_a

# =>
SELECT "users".* FROM "users"
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (1)


Т.к. preload всегда создает два отдельных запроса, то мы не можем использовать таблицу posts в условии выборки:

User.preload(:posts).where("posts.desc='ruby is awesome'")

# =>
SQLite3::SQLException: no such column: posts.desc:
SELECT "users".* FROM "users"  WHERE (posts.desc='ruby is awesome')


А таблицу users – можем:

User.preload(:posts).where("users.name='Neeraj'")

# =>
SELECT "users".* FROM "users"  WHERE (users.name='Neeraj')
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (3)




Includes


По умолчанию includes действует точно так же, как и preload, но в случае наличия условия по ассоциированной таблице переключается на создание единственного запроса с LEFT OUTER JOIN.

User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1,
       "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"
WHERE (posts.desc = "ruby is awesome")


Если по каким-то причинам необходимо форсировать применение такого подхода, то можно использовать метод references:

User.includes(:posts).references(:posts).to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1,
       "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"



Eager_load


Этот метод загружает ассоциации в одном запросе с использованием Left Outer Join, точно так же, как действует includes в сочетании с references.

User.eager_load(:posts).to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1, "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"



Joins


Создает запрос с использованием INNER JOIN. 

User.joins(:posts)

# =>
SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"


При этом, загружаются данные только из таблицы users. Кроме того, этот запрос может возвратить дублирующие друг друга записи:

def self.setup
  User.delete_all
  Post.delete_all

  u = User.create name: 'Neeraj'
  u.posts.create! title: 'ruby', desc: 'ruby is awesome'
  u.posts.create! title: 'rails', desc: 'rails is awesome'
  u.posts.create! title: 'JavaScript', desc: 'JavaScript is awesome'

  u = User.create name: 'Neil'
  u.posts.create! title: 'JavaScript', desc: 'Javascript is awesome'

  u = User.create name: 'Trisha'
end



Результат выполнения User.joins(:posts) в БД с такими данными:

#<User id: 9, name: "Neeraj">
#<User id: 9, name: "Neeraj">
#<User id: 9, name: "Neeraj">
#<User id: 10, name: "Neil">


Избежать повторений мы можем с использованием distinct:

User.joins(:posts).select('distinct users.*').to_a
# в комментариях подсказывают, что можно сделать проще:
User.joins(:posts).uniq


Если же мы хотим дополнительно получить какие-либо данные из таблицы posts, мы должны внести их в предложение select:

records = User.joins(:posts).select('distinct users.*, posts.title as posts_title').to_a
records.each do |user|
  puts user.name
  puts user.posts_title
end


Стоит заметить, что после выполнения метода joins вызов user.posts приведет в созданию еще одного запроса.

Методы eager нужны, чтобы избежать появления так называемых запросов N+1, и не стоит их использовать для подключения ассоциаций в where и order, для этого есть joins. Рекомендую гем bullet (https://github.com/flyerhzm/bullet), чтобы найти запросы в которых нужна eager-загрузка.

Плохо, когда появляются похожие штуки: ‘posts’.’user_id’ AS t1_r2, ‘posts’.’desc’ AS t1_r3, этим грешит includes особенно при сортировке через ассоциацию, даже если она подключена через joins (вроде в 4 исправили). И во многих случаях to_a не актуально.

Алсо, гем squeel (https://github.com/ernie/squeel) очень упрощает написание сложных запросов.

Объяснение SQL объединений JOIN: LEFT/RIGHT/INNER/OUTER

http://www.skillz.ru/dev/php/article-Obyasnenie_SQL_obedinenii_JOIN_INNER_OUTER.html

http://sqlfiddle.com/#!2/659f69/1

Разберем пример. Имеем две таблицы: пользователи и отделы.


U) users               D) departments
id name       d_id     id  name
-- ----       ----     --  ----
1  Владимир    1       1  Сейлз
2  Антон       2       2  Поддержка
3  Александр   6       3  Финансы
4  Борис       2       4  Логистика
5  Юрий        4




SELECT u.id, u.name, d.name AS d_name
FROM users u
INNER JOIN departments d ON u.d_id = d.id



Запрос вернет объединенные данные, которые пересекаются по условию, указанному в INNER JOIN ON <..>. 
В нашем случае условие <таблица_пользователей>.<идентификатор_отдела> должен совпадать с <таблица_отделов>.<идентификатор>

В результате отсутствуют:

- пользователь Александр (отдел 6 — не существует)
- отдел Финансы (нет пользователей) 


id name       d_name
-- --------   ---------
1  Владимир    Сейлз
2  Антон       Поддержка
4  Борис       Поддержка
3  Юрий        Логистика



sql inner join

рис. Inner join

Внутреннее объединение INNER JOIN (синоним JOIN, ключевое слово INNER можно опустить). 

Выбираются только совпадающие данные из объединяемых таблиц. Чтобы получить данные, которые не подходят по условию, необходимо использовать 

внешнее объединение — OUTER JOIN. 

Такое объединение вернет данные из обеих таблиц совпадающими по одному из условий.

sql left join

рис. Left join

Существует два типа внешнего объединения OUTER JOIN — LEFT OUTER JOIN и RIGHT OUTER JOIN. 

Работают они одинаково, разница заключается в том что LEFT — указывает что «внешней» таблицей будет находящаяся слева (в нашем примере это таблица users). 
Ключевое слово OUTER можно опустить. Запись LEFT JOIN идентична LEFT OUTER JOIN.


SELECT u.id, u.name, d.name AS d_name
FROM users u
LEFT OUTER JOIN departments d ON u.d_id = d.id



Получаем полный список пользователей и сопоставленные департаменты.


id      name          d_name
--      --------      ---------
1       Владимир      Сейлз
2       Антон         Поддержка
3       Александр     NULL
4       Борис         Поддержка
5       Юрий          Логистика



Добавив условие 

WHERE d.id IS NULL



в выборке останется только 3#Александр, так как у него не назначен департамент.

sql left outer join

рис. Left outer join с фильтрацией по полю


RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.


SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id




id      name        d_name
--      --------    ---------
1       Владимир    Сейлз
2       Антон       Поддержка
4       Борис       Поддержка
NULL    NULL        Финансы
5       Юрий        Логистика



Дополнительно можно отфильтровать данные, проверяя их на NULL.


SELECT d.id, d.name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
WHERE u.id IS NULL



В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи. (3#Финансы)


Все примеры вы можете протестировать здесь:

SQLFiddle


Self Join

Выборка из одной и той же таблицы для нескольких условий.

Рассмотрим задачку от яндекса: 

Есть таблица товаров.


CREATE TABLE `ya_goods` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO ya_goods VALUES (1'яблоки')(2'яблоки') ,(3'груши')(4,'яблоки')(5'апельсины')(6'груши');



Она содержит следующие значения.


`id`    `name`
1       Яблоки
2       Яблоки
3       Груши
4       Яблоки
5       Апельсины
6       Груши



Напишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например:

(1,2), (4,1), (2,4), (6,3)…

При решении задачи необходимо учесть, что пары (x,y) и (y,x) — одинаковы.

Решение:


SELECT g1.id id1, g2.id id2
-- CONCAT('(', LEAST(g1.id, g2.id), ',', GREATEST(g1.id, g2.id), ')') row
FROM ya_goods g1
INNER JOIN ya_goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id
GROUP BY LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id)
ORDER BY g1.id;
— или без группировки (быстрее)

SELECT DISTINCT CONCAT(‘(‘, LEAST(g1.id, g2.id)‘,’, GREATEST(g1.id, g2.id)‘)’) row
FROM ya_goods g1
INNER JOIN ya_goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id



Объединяем таблицы ya_goods по одинаковому полю `name`, группируем по уникальным idентификаторам и получаем результат.

(1,2)(1,4)(2,4)(3,6)


Множественное объединение multi join

Пригодится нам, если необходимо выбрать более одного значения из таблиц для нескольких условий.

Пример: набор вариантов (вес, объем) товаров. 
Продукты в таблице products, Варианты — таблица product_options, Значения вариантов — таблица product2options
Необходимо: фильтровать продукты по дате, и имеющимся вариантам

CREATE TABLE  `products` (
`id` int(11),
`title` varchar(255),
`created_at` datetime
)

CREATE TABLE `product_options` (
`id` int(11),
`name` varchar(255)
)

CREATE TABLE `product2options` (
`product_id` int(11),
`option_id` int(11),
`value` int(11)
)



Тестовые данные


INSERT INTO `products` (`id``title``created_at`) VALUES
(1'Кружка''2009-01-17 20:00:00'),
(2'Ложка''2009-01-18 20:00:00'),
(3'Тарелка''2009-01-19 20:00:00');
INSERT INTO `product_options` (`id``name`) VALUES
(11‘Вес’),
(12‘Объем’);

INSERT INTO `product2options` (`product_id``option_id``value`) VALUES
(111200),
(112250),
(21135),
(21215),
(311310),
(312300),
(21145),
(21225);



Пример: выбрать товары, 
добавленные после 17/01/2009 в следующих вариантах:
- вес=310, объем=300
- вес=35, объем=15
- вес=45, объем=25
- вес=200, объем=250

Просто перечислить условия вариантов в подзапросе/джоине через OR/AND не сработает, 
необходимо осуществить объединение таблиц вариантов равное количеству этих самых вариантов (у нас — 2: объем и вес)


SELECT p.*, po1.name 'P1', p2o1.value, po2.name 'P2', p2o2.value
FROM products p

INNER JOIN product2options p2o1 ON p.id = p2o1.product_id
INNER JOIN product_options po1  ON po1.id = p2o1.option_id

INNER JOIN product2options p2o2 ON p.id = p2o2.product_id
INNER JOIN product_options po2  ON po2.id = p2o2.option_id

WHERE p.created_at > ’2009-01-17 21:00′
AND ( — тарелка#3 
p2o1.option_id = 11 AND p2o1.value = 310
AND p2o2.option_id = 12 AND p2o2.value = 300
OR  — ложка#2
p2o1.option_id = 11 AND p2o1.value = 35
AND p2o2.option_id = 12 AND p2o2.value = 15
OR  — ложка#2
p2o1.option_id = 11 AND p2o1.value = 45
AND p2o2.option_id = 12 AND p2o2.value = 25
OR  — кружка#1 не попадает по дате
p2o1.option_id = 12 AND p2o1.value = 250
AND p2o2.option_id = 11 AND p2o2.value = 200
)
;



Результ выборки:


id      title        created_at                P1        value    P2            value
2       Ложка        2009-01-18 20:00:00       Вес        35      Объем         15
3       Тарелка      2009-01-19 20:00:00       Вес        310     Объем         300
2       Ложка        2009-01-18 20:00:00       Вес        45      Объем         25
— не попадает по дате
1       Кружка               2009-01-17 20:00:00    Объем      250  Вес           200



Этот пример на SQLFiddle

За бортом статьи остались смежные объединениям (а также специфичные для определенных базданных темы):
SELF JOIN, FULL OUTER JOIN, CROSS JOIN (CROSS [OUTER] APPLY), операции над множествами UNION [ALL], INTERSECT, EXCEPT и т.д.

mysqld php-fpm RAM

vi /etc/my.cnf

performance_schema = 0
table_cache = 100
table_definition_cache = 100
max-connect-errors = 10000
query_cache_size = 64M
query_cache_limit = 2M

vi /etc/php-fpm.d/www.conf

#listen = 127.0.0.1:9000
#user = daemon
#group = daemon

pm = dynamic
pm.max_children = 4
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 5
pm.max_requests = 50

 

nginx + php + mysql install

link

yum install openssh-server wget
yum -y update
yum repolist
rpm -ihv http://mirror.yandex.ru/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ihv http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install yum-priorities
vi /etc/yum.repos.d/epel.repo
vi /etc/yum.repos.d/nginx.repo

priority=10

yum install mysql mysql-server
chkconfig --levels 235 mysqld on
/usr/bin/mysql_secure_installation
service mysqld start

yum install nginx 
chkconfig --levels 235 nginx on 
yum remove httpd 
service nginx start

CentOS/RHEL 7.x:

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

CentOS/RHEL 6.x:

rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
yum install php56w php56w-opcache php56w-gd php56w-imap php56w-pdo php56w-mysql php56w-xml php56w-common php56w-process php56w-mbstring php56w-cli php56w-ldap php56w-devel php56w-fpm php56w-mssql php56w-magickwand php56w-mcrypt php56w-odbc php56w-pear php56w-shout php56w-snmp php56w-soap php56w-tidy php56w-xmlrpc

vi /etc/php.ini

files.upload_max_filesize = 100M 
post_max_size = 100M 
cgi.fix_pathinfo = 0 
chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start
yum install htop
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.default
vi /etc/nginx/nginx.conf
client_max_body_size 100m;
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

server {
        listen       80;
        server_name  _;

        location / {
            root   /usr/share/nginx/html;
            index  index.php index.html index.htm;
        }

        error_page  404              /404.html;
        location = /404.html {
            root   /usr/share/nginx/html;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
        location ~ \.php$ {
            root           /usr/share/nginx/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
        }
}

install/update/version mysql

Fixing Errors

mysql_upgrade -uroot -p

To list Old MySql

yum list installed | grep -i mysql

To remove Old MySql

yum remove mysql mysql-*

Remi Dependency on CentOS 6 and Red Hat (RHEL) 6

rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Install MySQL server

yum --enablerepo=remi,remi-test install mysql mysql-server

To list New MySql

yum list installed | grep -i mysql

start MySql server

/etc/init.d/mysqld start ## use restart after update

OR

service mysqld start ## use restart after update

chkconfig --levels 235 mysqld on

Last

mysql_upgrade -u root -p

Now my MySql version is 5.5.32

Ref:

http://www.webtatic.com/packages/mysql55/

http://www.if-not-true-then-false.com/2010/install-mysql-on-fedora-centos-red-hat-rhel/

mysql acces from

link

link2

CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' WITH GRANT OPTION;CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';GRAN TALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

у вас нет доступа к серверу для пары значений ‘IP_клиента’@’user’
в таблице пользователей на сервере нужно добавить юзера ‘%’@’user’ — % — значит с любого IP-адреса

Думаю так будет правильно:
сесть за сервер, добавить пользователя
CREATE USER ‘user’@’%’ IDENTIFIED BY ‘password’;
дать привилегии, какие необходимы
GRANT SELECT ON *.* TO ‘user’@’%’;