Utilizando Links Simbólicos para Tabelas
Antes do MariaDB você não deve utilizar tabelas com ligações simbólicas, se você não tiver muito cuidado com as mesmas. O problema é que se você executar ALTER TABLE, REPAIR TABLE ou OPTIMIZE TABLE em uma tabela ligada simbolicamente, os links simbólicos serão removidas e substituidos pelos arquivos originiais. Isto acontece porque o comando acima funcinoa criando um arquivo temporário no diretório de banco de dados e quando o comando é completo, substitui o arquivo original pelo arquivo temporário.
Você não deve ligar simbolicamente tabelas em um sistema que não possui uma chamada realpath() completa. (Pelo menos Linux e Solaris suportam realpath()
No MariaDB links simbólicos só são suportados completamente por tabelas MyISAM. Para outros tipos de tabelas você provavelmente obterá problemas estranhos ao fazer qualquer um dos comandos mencionados acima.
O tratamento de links simbólicos no MariaDB funciona da seguinte maneira (isto é mais relevante somente para tabelas MyISAM.
- No diretório de dados você sempre terá o arquivo de definições das tabelas e os arquivos de índice e o arquivo de dados. O arquivo de dados e o arquivo de índice podem ser movidos para qualquer lugar e substituidos no diretorio de dados pelos links simbólicos. O arquivo de definição não pode.
- Você pode ligar simbolicamente o arquivo índice e o arquivo de dados para diretórios diferentes, independente do outro arquivo.
- A ligação pode ser feita partir do sistema operacional (se o
mysqldnão estiver em execução) ou usando as opçõesDATA DIRECTORYouINDEX DIRECTORYemCREATE TABLE. Leia "SintaxeCREATE TABLE". myisamchknão irá substituir um link simbólico pelo índice/arquivo. Ele funciona diretamente nos arquivos apontados pelos links simbólicos. Qualquer arquivo temporário será criado no mesmo diretório que o arquivo de dados/índice está.- Quando você remove uma tabela que está usando links simbólicos, o link e o arquivo para o qual ela aponta são apagados. Esta é uma boa razão pela qual você
nãodeve executarmysqldcomoroote não deve permitir que pessoas tenham acesso de escrita ao diretórios de bancos de dados do MariaDB. - Se você renomear uma tabela com
ALTER TABLE RENAMEe não deseja alterar o banco de dados, o link simbólico para o diretório de banco de dados será renomeada corretamente. - Se você utiliza
ALTER TABLE RENAMEpara mover uma tabela para outro banco de dados, então a tabela será movida para outro diretório de banco de dados e os links simbólicos antigos e os arquivos para os quais eles apontam serão removidos. - Se você não utiliza links simbólicos, você deve usar a opção
--skip-symlinkdomysqldpara garantir que ninguém pode usarmysqldpara apagar ou renomear um arquivo fora do diretório de dados.
O que ainda não é suportado:
ALTER TABLEignora todas as opções de tabelaDATA DIRECTORYeINDEX DIRECTORY.SHOW CREATE TABLEnão relata se a tabela possui links simbólicos antes do MariaDB 4.0.15. Isto também é verdade paramysqldumpque usaSHOW CREATE TABLEpara gerar instruçõesCREATE TABLE.BACKUP TABLEeRESTORE TABLEnão respeitam links simbólicos.- O arquivo
frmnunca deve ser um link simbólico (como dito anteriormente, apenas os dados e índices podem ser links simbólicos). Fazer isto (por exemplo para fazer sinônimos), produzirá resultados errados. Suponha que você tenha um banco de dadosdb1sob o diretório de dados do MariaDB, uma tabelatbl1neste banco de dados e você faça um link simbólicotbl2no diretóriodb1que aponmta paratbl1:
shell>
cd /path/to/datadir/db1shell>ln -s tbl1.frm tbl2.frmshell>ln -s tbl1.MYD tbl2.MYDshell>ln -s tbl1.MYI tbl2.MYIAgora se uma thread lê
db1.tbl1e outra thread atualizadb1.tbl2, haverá problemas: a cache de consultas será enganada (ela acreditará quetbl1não foi atualizado e retornará resultados desatualizados), o comandoALTERemtbl2também irá falhar.