SlideShare a Scribd company logo
1 of 84
Download to read offline
Managing	
  a	
  shared	
  MySQL	
  farm
 Thijs	
  Feryn
 Evangelist
 +32	
  (0)9	
  218	
  79	
  06
 thijs@combellgroup.com

 phpDay
 Friday	
  May	
  13th	
  2011
 Verona,	
  Italy
About	
  me




 I’m	
  an	
  evangelist	
  at	
  Combell
About	
  me




 I’m	
  a	
  board	
  member	
  at	
  PHPBenelux
I	
  live	
  in	
  the	
  wonderful	
  city	
  of	
  Bruges
      MPBecker	
  -­‐	
  Bruges	
  by	
  Night	
  hYp://www.flickr.com/photos/galverson2/3715965933
Follow	
  me	
  on	
  TwiYer:	
  @ThijsFeryn

Give	
  me	
  feedback:	
  hYp://joind.in/3003

  Read	
  my	
  blog:	
  hYp://blog.feryn.eu
Challenges
Challenges



  ✓Management	
  across	
  mulaple	
  nodes
  ✓Aggregaang	
  data	
  from	
  mulaple	
  nodes
  ✓Name	
  clashes
  ✓Quota	
  management
Soluaons
Soluaons


 ✓Centralized	
  provisioning	
  database
 ✓GeYers	
  on	
  the	
  provisioning	
  database
 ✓Node	
  mapper	
  for	
  user/db/privilege	
  
 management
 ✓INFORMATION_SCHEMA	
  for	
  quota	
  
 management
 ✓Prefixes	
  to	
  avoid	
  name	
  clashes
Provisioning	
  plan
User         Database
✓Id           ✓Id
✓Prefix        ✓Node
✓Username     ✓Prefix
✓Password     ✓Database
✓Enabled      ✓Quota
✓DatabaseId   ✓Enabled
✓Write        ✓Overquota
✓CreateDate   ✓CreateDate
✓UpdateDate   ✓UpdateDate
Mapping	
  uses	
  cases	
  to	
  SQL
MySQL	
  authenacaaon	
  &	
  privilege	
  system
✓Add	
  user
✓Delete	
  user
✓Reset	
  user	
  password
✓Disable	
  user
✓Enable	
  user
Add	
  user


INSERT INTO `user`
(`prefix`,`username`,`password`,`createdate`)
VALUES(‘test’,‘test_user’,‘mypass123’,NOW());
Delete	
  user


DELETE FROM `user`
WHERE username=‘test_user’;

DELETE u.*, db.* FROM `mysql`.`user` u
LEFT JOIN `mysql`.`db` db
ON(db.`User` = u.`User`)
WHERE u.`User` = ‘test_user’;
Reset	
  user	
  password


UPDATE `user`
SET `password` = ‘newpass123’
WHERE `username` = ‘test_user’;

UPDATE `mysql`.`user`
SET `Password` = PASSWORD
(‘newpass123’)
WHERE `User`= ‘test_user’;
Disable	
  user


UPDATE `user`
SET `enabled` = '0'
WHERE `username` = ‘test_user’;

UPDATE `mysql`.`user`
SET `Host` = ‘localhost’
WHERE `User`= ‘test_user’
Enable	
  user


UPDATE `user`
SET `enabled` = '1'
WHERE `username` = ‘test_user’;

UPDATE `mysql`.`user`
SET `Host` = ‘%’
WHERE `User`= ‘test_user’
✓Add	
  database
✓Delete	
  database
✓Set	
  database	
  quota
✓Disable	
  database
✓Enable	
  database
Add	
  database

INSERT INTO `database`
(`node`,`prefix`,`database`,`quota`,`c
reatedate`) VALUES(1,‘test’,‘test_db’,
10,NOW());


CREATE DATABASE test_db1;
Delete	
  database




DELETE FROM `database`
WHERE `database` = ‘test_db’;
Delete	
  database
                                          Are	
  
                                     linked	
  to	
  this	
  
                                       database
SELECT u.username
FROM `user` u
WHERE u.databaseId = 123
GROUP BY u.username;                  Find	
  
                           deletable	
  users	
  to	
  
                           delete	
  from	
  MySQL	
  	
  
                            privileges	
  system
Delete	
  database

DELETE u.*, db.*
FROM `user` u
LEFT JOIN `db` db
ON(db.`User` = u.`User`)
WHERE u.`User` IN('test_user’);
                          Delete
                     these	
  users	
  from	
  
                     MySQL	
  	
  privileges	
  
                         system
Delete	
  database



DROP DATABASE test_db;
Set	
  database	
  quota




UPDATE `database`
SET `quota` = 100
WHERE `database` = ‘test_db’;
Disable	
  database


UPDATE `database` SET
`enabled` = '0'
WHERE `database` = ‘test_db’;

DELETE FROM `db`
WHERE db = 'test_db’;
Enable	
  database


UPDATE `database` SET
`enabled` = '1'
WHERE `database` = ‘test_db’;
Enable	
  database




SELECT u.username, u.write
FROM user u
WHERE u.databaseId = 123
                                     Find	
  
                             user	
  mappings	
  
                              to	
  re-­‐enable
Enable	
  database

INSERT INTO `db`
(Host,Db,User,Select_priv,Insert_priv,
Update_priv,Delete_priv,Create_priv,Drop_pr
iv,Grant_priv,References_priv,
Index_priv,Alter_priv,Create_tmp_table_priv
,Lock_tables_priv,
Create_view_priv,Show_view_priv,Create_rout
ine_priv,
Alter_routine_priv,Execute_priv)
Write	
  
Enable	
  database                  permissions

VALUES
(‘%’,‘test_db’,‘test_user’,'Y','Y','Y','Y',
'Y','Y','N','Y','Y','Y'
,'Y','Y','Y','Y','Y','Y','Y');       Read-­‐
                                      only	
  
                                  permissions
VALUES
(‘%’,‘test_db’,‘test_user’,'Y','N','N','N',
'N','N','N','N','N','N','N','N','N','Y','N'
,'N','Y');
✓Grant	
  privilege
✓Revoke	
  privilege
✓Enable	
  database	
  wriang
✓Disable	
  database	
  wriang
Write	
  
Grant	
  privilege            permissions

UPDATE `user`
SET `databaseId`=123, `write`='1'
WHERE `username`= ‘test_user’;
                                 Read-­‐
                                  only	
  
                              permissions
UPDATE `user`
SET `databaseId`=123, `write`='0'
WHERE `username`= ‘test_user’;
Grant	
  privilege
                                    Try	
  
                           adding	
  user	
  or	
  
                           catch	
  duplicate	
  
                            user	
  error

INSERT INTO `user`(Host,User,Password)
VALUES(‘%’,‘test_user’,PASSWORD
(‘password’));
Grant	
  privilege

INSERT INTO `db`
(Host,Db,User,Select_priv,Insert_priv,
Update_priv,Delete_priv,Create_priv,Drop_pr
iv,Grant_priv,References_priv,
Index_priv,Alter_priv,Create_tmp_table_priv
,Lock_tables_priv,
Create_view_priv,Show_view_priv,Create_rout
ine_priv,
Alter_routine_priv,Execute_priv)
Write	
  
Grant	
  privilege                  permissions

VALUES
(‘%’,‘test_db’,‘test_user’,'Y','Y','Y','Y',
'Y','Y','N','Y','Y','Y'
,'Y','Y','Y','Y','Y','Y','Y');       Read-­‐
                                      only	
  
                                  permissions
VALUES
(‘%’,‘test_db’,‘test_user’,'Y','N','N','N',
'N','N','N','N','N','N','N','N','N','Y','N'
,'N','Y');
Revoke	
  privilege


UPDATE `user`
SET `databaseId`= NULL, `write`= NULL
WHERE `user`= ‘test_user’;

DELETE u.*, db.* FROM `user` u LEFT JOIN
`db` db ON(db.`User` = u.`User`) WHERE
u.`User` = ‘test_user’;
Enable	
  database	
  wriang




UPDATE `user` SET `write`= '1'
WHERE `username` = ‘test_user’;
Enable	
  database	
  wriang
UPDATE `db` SET
`Select_priv` = 'Y',`Insert_priv` = 'Y',
UPDATE `user`'Y',`Delete_priv` '1'
`Update_priv` =
                 SET `write`= = 'Y',
WHERE `username` = ‘test_user’;
`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Grant_priv` = 'N',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',
`Create_tmp_table_priv`='Y',`Lock_tables_priv` =
'Y',
`Create_view_priv` = 'Y',`Show_view_priv` =
'Y',`Create_routine_priv` = 'Y',
`Alter_routine_priv` = 'Y',`Execute_priv` = 'Y'
WHERE `db`= ‘test_db’ AND `user` = ‘test_user’;
Disable	
  database	
  wriang




UPDATE `user` SET `write`= '0'
WHERE `username` = ‘test_user’;
Disable	
  database	
  wriang
UPDATE `db` SET
`Select_priv` = 'Y',`Insert_priv` = 'N',
UPDATE `user`'N',`Delete_priv` '1'
`Update_priv` =
                 SET `write`= = 'N',
WHERE `username` = ‘test_user’;
`Create_priv` = 'N',`Drop_priv` = 'N',
`Grant_priv` = 'N',`References_priv` = 'N',
`Index_priv` = 'N',`Alter_priv` = 'N',
`Create_tmp_table_priv`='N',`Lock_tables_priv` =
'N',
`Create_view_priv` = 'N',`Show_view_priv` =
'Y',`Create_routine_priv` = 'N',
`Alter_routine_priv` = 'N',`Execute_priv` = 'Y'
WHERE `db`= ‘test_db’ AND `user` = ‘test_user’;
Quota	
  management
Quota	
  management


✓Limits	
  in	
  provisioning	
  database
✓Current	
  usage	
  stored	
  in	
  
INFORMATION_SCHEMA
✓Raao	
  calculated	
  via	
  cron	
  task
✓Write	
  permissions	
  disabled	
  while	
  over	
  quota
Quota	
  management

SELECT `database`,`quota`
FROM `database`

SELECT TABLE_SCHEMA as `database`,
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH)/
1048576,2) as `usage`
FROM `information_schema`.`TABLES`
GROUP BY TABLE_SCHEMA
Quota	
  management



UPDATE `database`
SET `overquota` = '1'
WHERE `database` = ‘test_db’;
Quota	
  management
UPDATE `db` SET
`Select_priv` = 'Y',`Insert_priv` = 'N',
`Update_priv` = 'N',`Delete_priv` = 'Y',
`Create_priv` = 'N',`Drop_priv` = 'Y',
`Grant_priv` = 'N',`References_priv` = 'N',
`Index_priv` = 'N',`Alter_priv` = 'N',
`Create_tmp_table_priv` =
'N',`Lock_tables_priv` = 'N',
`Create_view_priv` = 'N',`Show_view_priv` =
'Y',`Create_routine_priv` = 'N',
`Alter_routine_priv` = 'N',`Execute_priv` =
'Y' WHERE `db`= ‘test_database’
Quota	
  management



UPDATE `database`
SET `overquota` = '0'
WHERE `database` = ‘test_db’;
Quota	
  management
UPDATE `db` SET
`Select_priv` = 'Y',`Insert_priv` = 'Y',
`Update_priv` = 'Y',`Delete_priv` = 'Y',
`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Grant_priv` = 'N',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',
`Create_tmp_table_priv`=
'Y',`Lock_tables_priv` = 'Y',
`Create_view_priv` = 'Y',`Show_view_priv` =
'Y',`Create_routine_priv` = 'Y',
`Alter_routine_priv` = 'Y',`Execute_priv` =
'Y' WHERE `db`= ‘test_db’
Goals
Single	
  point	
  of	
  management
Single	
  point	
  of	
  connecaon
Replicaaon	
  &	
  loadbalancing
Proxying	
  strategies
Server	
  proxy
Goal
Goal


✓	
  Accept	
  connecaon	
  using	
  the	
  proxy
✓Hook	
  into	
  the	
  authenacaaon
✓Match	
  user	
  to	
  the	
  provisioning	
  DB
✓Fetch	
  node	
  from	
  provisioning
✓Switch	
  to	
  the	
  right	
  node
➡Effecave	
  proxying	
  soluaon
Reality
Reality


✓	
  Accept	
  connecaon	
  using	
  the	
  proxy
✓Hook	
  into	
  the	
  authenacaaon
✓Match	
  user	
  to	
  the	
  provisioning	
  DB
✓Fetch	
  node	
  from	
  provisioning
✓Switch	
  to	
  the	
  right	
  node
➡Effecave	
  proxying	
  soluaon
Reality

Connecaon	
  switching	
  only	
  happens	
  in	
  the	
  
        connect_server	
  hook




  Auth	
  info	
  is	
  only	
  available	
  starang	
  from	
  
                 the	
  read_auth	
  hook
Bridge	
  the	
  gap




     Redirect	
  to	
  node	
  based	
  on	
  client	
  IP
Let’s	
  see	
  some	
  code	
  !
Code
require('luarocks.require')
require('md5')
require('Memcached')
require('luasql.mysql')
local	
  memcache	
  =	
  Memcached.Connect()
-­‐-­‐-­‐	
  config
local	
  mysqlhost	
  =	
  "localhost"
local	
  mysqluser	
  =	
  "myUser"
local	
  mysqlpassword	
  =	
  "MyPwDsesd"
local	
  mysqldatabase	
  =	
  "test"
-­‐-­‐	
  debug
local	
  debug	
  =	
  true


                Dependencies	
  &	
  config
Code
function	
  error_result	
  (msg)
	
   proxy.response	
  =	
  {
	
   	
       type	
  =	
  proxy.MYSQLD_PACKET_ERR,
	
   	
       errmsg	
  =	
  msg,
	
   	
       errcode	
  =	
  7777,
	
   	
       sqlstate	
  =	
  'X7777',
	
   }
	
   return	
  proxy.PROXY_SEND_RESULT
end


                Custom	
  MySQL	
  errors
function	
  node_get(ip)
	
     local	
  node	
  =	
  memcache:get(md5.sumhexa(ip))
Code
	
  
	
     if	
  not	
  node	
  ==	
  nil	
  then
	
     	
  	
  	
  return	
  loadstring('return	
  '..memcache:get(md5.sumhexa
(ip)))()	
                	
  
	
     end
	
  
	
     node	
  =	
  sql_get(ip)
	
     if	
  node	
  ==	
  nil	
  then
	
     	
  	
  	
  	
  return	
  nil
	
     end

      	
  	
  	
  memcache:set(md5.sumhexa(ip),	
  node,	
  3600)	
  
      	
  	
  	
  return	
  node
end



           Get	
  node	
  from	
  cache	
  or	
  database
function	
  sql_get(ip)	
  
	
       env	
  =	
  assert	
  (luasql.mysql())
Code
	
       con	
  =	
  assert	
  (env:connect
(mysqldatabase,mysqluser,mysqlpassword,mysqlhost))
	
       cur	
  =	
  assert	
  (con:execute(string.format("SELECT	
  
n.`id`	
  FROM	
  `accesslist`	
  a	
  JOIN	
  `node`	
  n	
  ON(n.id=a.node)	
  
WHERE	
  a.`ip`	
  =	
  '%s'",ip)))	
  
	
       row	
  =	
  cur:fetch	
  ({},	
  "a")
	
       if	
  cur:numrows()	
  ==	
  0	
  then
	
       	
          return	
  nil
	
       end
	
       cur:close()
	
       con:close()
	
       env:close()
	
       return	
  row.id
end


      Get	
  node	
  from	
  provisioning	
  database
Code
function	
  connect_server()
	
  	
  	
  	
  selectedNode	
  =	
  node_get
(proxy.connection.client.src.address)

	
  	
  	
  	
  if	
  selectedNode	
  ==	
  nil	
  then
	
  	
  	
  	
  	
  	
  	
  	
  return	
  error_result(string.format("No	
  info	
  found	
  in	
  
the	
  cluster	
  for	
  IP	
  
'%s'",proxy.connection.client.src.address))
	
  	
  	
  	
  end

	
  	
  	
  	
  proxy.connection.backend_ndx	
  =	
  selectedNode	
   	
  
end


                 Retrieve	
  and	
  switch	
  to	
  node
Reality



  MySQL	
  Proxy	
  is	
  not	
  acavely	
  supported
Client	
  proxy
MySQL	
  Naave	
  Driver	
  Plugins
MySQL	
  Naave	
  Driver	
  Plugins

✓	
  Accept	
  connecaon	
  using	
  the	
  proxy
✓Hook	
  into	
  the	
  authenacaaon
✓Match	
  user	
  to	
  the	
  provisioning	
  DB
✓Fetch	
  node	
  from	
  provisioning
✓Switch	
  to	
  the	
  right	
  node
✓Doesn’t	
  work	
  for	
  remote	
  connecaons
➡Effecave	
  proxying	
  soluaon
DNS	
  &	
  hostnames




             Hostname	
  per	
  account
What	
  about	
  PhpMyAdmin?
What	
  about	
  PhpMyAdmin?


✓Use	
  single	
  signon	
  auth	
  module
✓Use	
  customized	
  fallback	
  auth	
  module
✓Detect	
  linked	
  database	
  &	
  node
✓Switch	
  to	
  node
config.inc.php
<?php
$cfg['Servers'][1]['auth_type'] = 'httpsoap';
$cfg['Servers'][1]['host'] = '1.2.3.4';
$cfg['Servers'][1]['connect_type'] = 'tcp';
$cfg['Servers'][1]['compress'] = false;
$cfg['Servers'][1]['extension'] = 'mysql';
$cfg['Servers'][1]['AllowNoPassword'] = false;
$cfg['Servers'][2]['auth_type'] = 'httpsoap';
$cfg['Servers'][2]['host'] = '1.2.3.5';
$cfg['Servers'][2]['connect_type'] = 'tcp';
$cfg['Servers'][2]['compress'] = false;
$cfg['Servers'][2]['extension'] = 'mysql';
$cfg['Servers'][2]['AllowNoPassword'] = false;
$cfg['Servers'][3]['extension'] = 'mysql';
$cfg['Servers'][3]['auth_type'] = 'signon';
$cfg['Servers'][3]['SignonSession'] = 'SSOSession';
$cfg['Servers'][3]['SignonURL'] = 'scripts/signon.php';
$cfg['Servers'][3]['LogoutURL'] = 'scripts/signon-logout.php';
scripts/signon.php
<?php
if (isset($_REQUEST['user'])) {
    try{
        $soap = new SoapClient('http://my.soap-
webservice.net/?WSDL');
        $user = $soap->user_getByUsername($_REQUEST['user']);
        if(!isset($_REQUEST['hash'])){
           die("No hash submitted");
        }
        if(sha1($user->username.$user-
>password.'azertyuiop') !== $_REQUEST['hash']){
            die("Invalid hash");
        }
    } catch (Exception $e){
        die("No such user");
    }
...
scripts/signon.php
    session_set_cookie_params(0, '/', '', 0);
    $session_name = 'SSOSession';
    session_name($session_name);
    session_start();
    $_SESSION['PMA_single_signon_user'] = $user->username;
    $_SESSION['PMA_single_signon_password'] = $user-
>password;
    $_SESSION['PMA_single_signon_host'] = $user->node;
    $_SESSION['PMA_single_signon_port'] = '3306';
    $id = session_id();
    session_write_close();
    header('Location: ../index.php?server=3');
} else {
    header('Location: ../index.php?server=1');
    exit();
}
scripts/signon-­‐logout.php


<?php
session_set_cookie_params(0, '/', '', 0);
$session_name = 'SSOSession';
session_name($session_name);
session_start();
session_destroy();
header('Location: ../index.php?server=1');
Customized	
  fallback	
  auth	
  module


✓Copy	
  of	
  ./libraries/auth/h4p.auth.lib.php
✓Modify	
  PMA_auth_set_user()	
  funcaon
✓Implement	
  detecaon	
  logic
✓Communicates	
  with	
  provisioning	
  service
✓Retrieves	
  database	
  &	
  node
✓Switches	
  to	
  node
libraries/auth/hYpsoap.auth.lib.php
<?php
function PMA_auth_set_user()
{
    global $cfg, $server;
    global $PHP_AUTH_USER, $PHP_AUTH_PW;
    try{
        $soap = new SoapClient('http://my.soap-
webservice.net/?WSDL');
        $user = $soap->user_getByUsername
($PHP_AUTH_USER);
        $cfg['Server']['host'] = $user->node;
    } catch (Exception $e){
        PMA_auth();
        return true;
    }
...
libraries/auth/hYpsoap.auth.lib.php
if ($cfg['Server']['user'] != $PHP_AUTH_USER) {
  $servers_cnt = count($cfg['Servers']);
  for ($i = 1; $i <= $servers_cnt; $i++) {
   if (isset($cfg['Servers'][$i])
    && ($cfg['Servers'][$i]['host'] == $cfg['Server']
['host'] && $cfg['Servers'][$i]
['user'] == $PHP_AUTH_USER)) {
     $server = $i;
                $cfg['Server'] = $cfg['Servers'][$i];
                break;
            }
        }
    }
    $cfg['Server']['user']     = $PHP_AUTH_USER;
    $cfg['Server']['password'] = $PHP_AUTH_PW;
    return true;
}
Q&A

More Related Content

What's hot

Permissions script for SQL Permissions
Permissions script for SQL PermissionsPermissions script for SQL Permissions
Permissions script for SQL Permissions
Tobias Koprowski
 
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Fabien Potencier
 
The Query the Whole Query and Nothing but the Query
The Query the Whole Query and Nothing but the QueryThe Query the Whole Query and Nothing but the Query
The Query the Whole Query and Nothing but the Query
Chris Olbekson
 
บทที่6 update&delete
บทที่6 update&deleteบทที่6 update&delete
บทที่6 update&delete
Palm Unnop
 

What's hot (20)

Heuristic
HeuristicHeuristic
Heuristic
 
Ajax nested form and ajax upload in rails
Ajax nested form and ajax upload in railsAjax nested form and ajax upload in rails
Ajax nested form and ajax upload in rails
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in Doctrine
 
Metrics for example Java project
Metrics for example Java projectMetrics for example Java project
Metrics for example Java project
 
Permissions script for SQL Permissions
Permissions script for SQL PermissionsPermissions script for SQL Permissions
Permissions script for SQL Permissions
 
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
Decouple Your Code For Reusability (International PHP Conference / IPC 2008)
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
I regret nothing
I regret nothingI regret nothing
I regret nothing
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 
Sk.php
Sk.phpSk.php
Sk.php
 
Intro To jQuery In Drupal
Intro To jQuery In DrupalIntro To jQuery In Drupal
Intro To jQuery In Drupal
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
 
The Query the Whole Query and Nothing but the Query
The Query the Whole Query and Nothing but the QueryThe Query the Whole Query and Nothing but the Query
The Query the Whole Query and Nothing but the Query
 
PHP with MYSQL
PHP with MYSQLPHP with MYSQL
PHP with MYSQL
 
บทที่6 update&delete
บทที่6 update&deleteบทที่6 update&delete
บทที่6 update&delete
 
Introduction to hibernate
Introduction to hibernateIntroduction to hibernate
Introduction to hibernate
 
究極のコントローラを目指す
究極のコントローラを目指す究極のコントローラを目指す
究極のコントローラを目指す
 
New Authorization library for Joomla 4 (proposal)
New Authorization library for Joomla 4 (proposal)New Authorization library for Joomla 4 (proposal)
New Authorization library for Joomla 4 (proposal)
 
ATG Secure Repository
ATG Secure RepositoryATG Secure Repository
ATG Secure Repository
 
My sql1
My sql1My sql1
My sql1
 

Viewers also liked

New Strategic Planning by Arash Izadkhah
New Strategic Planning by Arash IzadkhahNew Strategic Planning by Arash Izadkhah
New Strategic Planning by Arash Izadkhah
Arash Izadkhah
 
Better Connecting the Somewhat Connected
Better Connecting the Somewhat ConnectedBetter Connecting the Somewhat Connected
Better Connecting the Somewhat Connected
Christina Cacioppo
 
Think innovation issue 4 share - scamper
Think innovation issue 4   share - scamperThink innovation issue 4   share - scamper
Think innovation issue 4 share - scamper
ThinkInnovation
 
Competència digital 1
Competència digital 1Competència digital 1
Competència digital 1
Nuria Alart
 
Portàtils a l’aula
Portàtils a l’aulaPortàtils a l’aula
Portàtils a l’aula
Nuria Alart
 
Max Glutathione Study
Max Glutathione StudyMax Glutathione Study
Max Glutathione Study
Mark Royer
 

Viewers also liked (20)

Kepler04012010
Kepler04012010Kepler04012010
Kepler04012010
 
Php through the eyes of a hoster pbc10
Php through the eyes of a hoster pbc10Php through the eyes of a hoster pbc10
Php through the eyes of a hoster pbc10
 
King And Tub
King And TubKing And Tub
King And Tub
 
Exa profile & products
Exa profile & products Exa profile & products
Exa profile & products
 
1周遅れのScala入学 #nds41
1周遅れのScala入学 #nds411周遅れのScala入学 #nds41
1周遅れのScala入学 #nds41
 
Weird Time - Ignite Phoenix
Weird Time - Ignite PhoenixWeird Time - Ignite Phoenix
Weird Time - Ignite Phoenix
 
Varnish in action confoo11
Varnish in action confoo11Varnish in action confoo11
Varnish in action confoo11
 
New Strategic Planning by Arash Izadkhah
New Strategic Planning by Arash IzadkhahNew Strategic Planning by Arash Izadkhah
New Strategic Planning by Arash Izadkhah
 
Better Connecting the Somewhat Connected
Better Connecting the Somewhat ConnectedBetter Connecting the Somewhat Connected
Better Connecting the Somewhat Connected
 
Think innovation issue 4 share - scamper
Think innovation issue 4   share - scamperThink innovation issue 4   share - scamper
Think innovation issue 4 share - scamper
 
Competència digital 1
Competència digital 1Competència digital 1
Competència digital 1
 
Erickson
EricksonErickson
Erickson
 
Paris
ParisParis
Paris
 
NDS#28 SIerの未来
NDS#28 SIerの未来NDS#28 SIerの未来
NDS#28 SIerの未来
 
Portàtils a l’aula
Portàtils a l’aulaPortàtils a l’aula
Portàtils a l’aula
 
Bands
BandsBands
Bands
 
Exa profile
Exa profile Exa profile
Exa profile
 
Sketch my ideas
Sketch my ideasSketch my ideas
Sketch my ideas
 
L‘Harmony_Report
L‘Harmony_ReportL‘Harmony_Report
L‘Harmony_Report
 
Max Glutathione Study
Max Glutathione StudyMax Glutathione Study
Max Glutathione Study
 

Similar to Managing a shared_mysql_farm_phpday2011

DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7
chuvainc
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::Manager
Jay Shirley
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
archwisp
 

Similar to Managing a shared_mysql_farm_phpday2011 (20)

Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioning
 
Being! Black Hat with Drupal - Anand Toshniwal
Being! Black Hat with Drupal - Anand ToshniwalBeing! Black Hat with Drupal - Anand Toshniwal
Being! Black Hat with Drupal - Anand Toshniwal
 
Quick MySQL performance check
Quick MySQL performance checkQuick MySQL performance check
Quick MySQL performance check
 
My sql administration
My sql administrationMy sql administration
My sql administration
 
Intro to SQL Injection
Intro to SQL InjectionIntro to SQL Injection
Intro to SQL Injection
 
Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)Best Practices in Plugin Development (WordCamp Seattle)
Best Practices in Plugin Development (WordCamp Seattle)
 
Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2Zend Framework Study@Tokyo #2
Zend Framework Study@Tokyo #2
 
MySQL server security
MySQL server securityMySQL server security
MySQL server security
 
DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7DrupalCamp Foz - Novas APIs Drupal 7
DrupalCamp Foz - Novas APIs Drupal 7
 
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQLPGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
PGConf APAC 2018 - Lightening Talk #2 - Centralizing Authorization in PostgreSQL
 
Centralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQLCentralising Authorisation in PostgreSQL
Centralising Authorisation in PostgreSQL
 
Drupal as a web framework
Drupal as a web frameworkDrupal as a web framework
Drupal as a web framework
 
The State of Lithium
The State of LithiumThe State of Lithium
The State of Lithium
 
15. CodeIgniter editarea inregistrarilor
15. CodeIgniter editarea inregistrarilor15. CodeIgniter editarea inregistrarilor
15. CodeIgniter editarea inregistrarilor
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::Manager
 
CakePHP workshop
CakePHP workshopCakePHP workshop
CakePHP workshop
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Nagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and Nagios
Nagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and NagiosNagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and Nagios
Nagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and Nagios
 
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QACreating "Secure" PHP Applications, Part 1, Explicit Code & QA
Creating "Secure" PHP Applications, Part 1, Explicit Code & QA
 
Unit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBeneluxUnit testing with zend framework PHPBenelux
Unit testing with zend framework PHPBenelux
 

More from Combell NV

2012 03-27 developers e-commercedag presentatie5 ssl
2012 03-27 developers e-commercedag presentatie5 ssl2012 03-27 developers e-commercedag presentatie5 ssl
2012 03-27 developers e-commercedag presentatie5 ssl
Combell NV
 
2012 03-27 developers e-commercedag presentatie2 drupal
2012 03-27 developers e-commercedag presentatie2 drupal2012 03-27 developers e-commercedag presentatie2 drupal
2012 03-27 developers e-commercedag presentatie2 drupal
Combell NV
 
2012 03-27 developers e-commercedag presentatie1 magento
2012 03-27 developers e-commercedag presentatie1 magento2012 03-27 developers e-commercedag presentatie1 magento
2012 03-27 developers e-commercedag presentatie1 magento
Combell NV
 
2012 03-27 developers e-commercedag presentatie4 ogone
2012 03-27 developers e-commercedag presentatie4 ogone2012 03-27 developers e-commercedag presentatie4 ogone
2012 03-27 developers e-commercedag presentatie4 ogone
Combell NV
 
2012 02-07 sql denali presentatie microsoft
2012 02-07 sql denali presentatie microsoft2012 02-07 sql denali presentatie microsoft
2012 02-07 sql denali presentatie microsoft
Combell NV
 

More from Combell NV (20)

Play it extra safe! Kies een goede cyberverzekering
Play it extra safe! Kies een goede cyberverzekeringPlay it extra safe! Kies een goede cyberverzekering
Play it extra safe! Kies een goede cyberverzekering
 
Hoe gebruik je het resellerplatform als partner van Combell
Hoe gebruik je het resellerplatform als partner van CombellHoe gebruik je het resellerplatform als partner van Combell
Hoe gebruik je het resellerplatform als partner van Combell
 
Managed WordPress bij Combell – wat doet dat precies?
Managed WordPress bij Combell – wat doet dat precies?Managed WordPress bij Combell – wat doet dat precies?
Managed WordPress bij Combell – wat doet dat precies?
 
Back-ups: Hoe ze je kunnen redden van een cyberaanval
Back-ups: Hoe ze je kunnen redden van een cyberaanvalBack-ups: Hoe ze je kunnen redden van een cyberaanval
Back-ups: Hoe ze je kunnen redden van een cyberaanval
 
Cyberaanvallen: Overzicht, gevolgen en beveiligingstips
Cyberaanvallen: Overzicht, gevolgen en beveiligingstipsCyberaanvallen: Overzicht, gevolgen en beveiligingstips
Cyberaanvallen: Overzicht, gevolgen en beveiligingstips
 
Hoe gebruik je het resellerplatform als partner van Combell
Hoe gebruik je het resellerplatform als partner van CombellHoe gebruik je het resellerplatform als partner van Combell
Hoe gebruik je het resellerplatform als partner van Combell
 
Hoe laat je jouw website scoren in zoekmachines zoals Google
Hoe laat je jouw website scoren in zoekmachines zoals GoogleHoe laat je jouw website scoren in zoekmachines zoals Google
Hoe laat je jouw website scoren in zoekmachines zoals Google
 
Een webshop bouwen in WooCommerce – advanced sessie
Een webshop bouwen in WooCommerce – advanced sessieEen webshop bouwen in WooCommerce – advanced sessie
Een webshop bouwen in WooCommerce – advanced sessie
 
Hoe start je een webshop met WordPress / WooCommerce
Hoe start je een webshop met WordPress / WooCommerceHoe start je een webshop met WordPress / WooCommerce
Hoe start je een webshop met WordPress / WooCommerce
 
Keeping the cloud in check cvodmd
Keeping the cloud in check cvodmdKeeping the cloud in check cvodmd
Keeping the cloud in check cvodmd
 
Hybrid cloud wiskyweb2012
Hybrid cloud wiskyweb2012Hybrid cloud wiskyweb2012
Hybrid cloud wiskyweb2012
 
2012 03-27 developers e-commercedag presentatie5 ssl
2012 03-27 developers e-commercedag presentatie5 ssl2012 03-27 developers e-commercedag presentatie5 ssl
2012 03-27 developers e-commercedag presentatie5 ssl
 
2012 03-27 developers e-commercedag presentatie2 drupal
2012 03-27 developers e-commercedag presentatie2 drupal2012 03-27 developers e-commercedag presentatie2 drupal
2012 03-27 developers e-commercedag presentatie2 drupal
 
2012 03-27 developers e-commercedag presentatie1 magento
2012 03-27 developers e-commercedag presentatie1 magento2012 03-27 developers e-commercedag presentatie1 magento
2012 03-27 developers e-commercedag presentatie1 magento
 
2012 03-27 developers e-commercedag presentatie4 ogone
2012 03-27 developers e-commercedag presentatie4 ogone2012 03-27 developers e-commercedag presentatie4 ogone
2012 03-27 developers e-commercedag presentatie4 ogone
 
10 doe-het-zelf tips om aan e-commerce te doen
10 doe-het-zelf tips om aan e-commerce te doen10 doe-het-zelf tips om aan e-commerce te doen
10 doe-het-zelf tips om aan e-commerce te doen
 
Develop and deploy using Hybrid Cloud Strategies confoo2012
Develop and deploy using Hybrid Cloud Strategies confoo2012Develop and deploy using Hybrid Cloud Strategies confoo2012
Develop and deploy using Hybrid Cloud Strategies confoo2012
 
Php through the eyes of a hoster confoo
Php through the eyes of a hoster confooPhp through the eyes of a hoster confoo
Php through the eyes of a hoster confoo
 
Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012Hybrid Cloud PHPUK2012
Hybrid Cloud PHPUK2012
 
2012 02-07 sql denali presentatie microsoft
2012 02-07 sql denali presentatie microsoft2012 02-07 sql denali presentatie microsoft
2012 02-07 sql denali presentatie microsoft
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

Managing a shared_mysql_farm_phpday2011