10
votes

Forcer une base de données MySQL entière à être en mémoire

Pour gérer un grand nombre de tests interagissant avec la base de données, je veux faire deux choses:

  1. Je voudrais copier le schéma d'une base de données sans copier ses données. Je peux le faire avec un script qui saisit les instructions de création de table de chaque tableau de la base de données.

  2. Lors de la création de cette base de données, je voudrais le forcer à être 100% en mémoire.

    Je suis coincé sur la façon de faire la partie 2 - Y a-t-il un moyen plus facile de le faire autre que de spécifier le moteur de chaque table? En quelque sorte cela semble être une mauvaise façon de le faire.


0 commentaires

4 Réponses :


1
votes
SET storage_engine=MEMORY;
This is going to set the default storage engine for the current session.

3 commentaires

Il y a une limite Quelle est la taille d'une table de mémoire. Il est douteux (mais possible) que toutes les tables d'un DB seront capables d'être des tables de mémoire


Les tables de mémoire ont toujours leurs métadonnées stockées sur le disque et elles ne se comportent pas les mêmes que les autres moteurs.


Développement ultérieur @MarkR Commentaire: MyISAM et INNODB sont déjà très différents et peuvent conduire à des comportements différents, entraînant des bogues qui n'arrivent qu'à un seul moteur. Ainsi, je recommande de ne pas modifier votre moteur de base de données vers Mémoire , car il va probablement introduire des bogues spécifiques à un moteur.



11
votes

Créer la base de données dans / dev / shm (Ubuntu | Debian) et ce sera en RAM. Il peut atteindre 0,5 de mémoire disponible.


4 commentaires

Cela semble bon, mais y a-t-il une solution similaire pour Centos?


Vérifiez si vous l'avez: $ Mount | grep shm. Sinon, vous pouvez créer un système de fichiers sur l'un des / dev / bélier * et le monter quelque part.


Centos 5.0+ a toujours / dev / shm monté. Cependant, vous pouvez monter une TMPF partout où vous le souhaitez. TMPFS est disponible pendant un certain temps.


Les gars, ne savons pas si c'est correct, juste essayé: MV / USR / local / mysql / Data / bla / SHM .... LN -S / Dev / SHM / BLAH -> Données / bla .... redémarrage de MySQL ... c'est volant



2
votes

comme dtmilano dit, vous pouvez le mettre sur un système de fichiers monté TMPFS. Il n'est pas nécessaire que ce soit / dev / shm, mais c'est un endroit où TMPFS est généralement monté.

Vous pouvez créer un nouveau n'importe où, bien que: xxx

Si cela remplit tout votre RAM disponible, il utilisera Swap comme sauvegarde.

Mettez-le dans / etc / fstab à re-monter au démarrage. N'oubliez pas que c'est un disque RAM, de sorte qu'il commence vide à chaque fois que vous redémarrez. Voir: http://www.howtoforge.com/storing-files -Directories-in-Memory-with-tmpfs

alternativement, comme suggéré par Yuxhuang Vous pouvez créer une table de type mémoire . Il se vide également sur le redémarrage, bien que la définition de la table reste. Le type de table de mémoire a quelques restrictions, cependant. Il utilise des lignes de taille fixe, par exemple, donc texte et blob ne sont pas autorisés, et varchar n'est pas une longueur variable. Voir: http://dev.mysql.com/doc /refman/5.0/fr/Memory-Storage-Engine.html


0 commentaires

1
votes

Si vous utilisez Windows, dans votre script de création de base de données, vous pouvez créer les tables ajoutant le paramètre de mémoire comme ceci:

CREATE TABLE IF NOT EXISTS `user` (
  `id` varchar(23) NOT NULL,
  `username` varchar(250) NOT NULL,
  ...
) ENGINE=MEMORY DEFAULT CHARSET=utf8;


0 commentaires